Skip to content

Commit a33daac

Browse files
authored
feat: Include version in user-agent. (#98)
1 parent 6f968ed commit a33daac

File tree

18 files changed

+138
-122
lines changed

18 files changed

+138
-122
lines changed

libs/client-sdk/src/client.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ namespace launchdarkly::client_side {
66

77
Client::Client(Config config, Context context)
88
: client(std::make_unique<ClientImpl>(std::move(config),
9-
std::move(context))) {}
9+
std::move(context),
10+
kVersion)) {}
1011
bool Client::Initialized() const {
1112
return false;
1213
}

libs/client-sdk/src/client_impl.cpp

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,22 @@
1919
namespace launchdarkly::client_side {
2020

2121
// The ASIO implementation assumes that the io_context will be run from a
22-
// single thread, and applies several optimisations based on this assumption.
22+
// single thread, and applies several optimisations based on this
23+
// assumption.
2324
auto const kAsioConcurrencyHint = 1;
2425

2526
// Client's destructor attempts to gracefully shut down the datasource
2627
// connection in this amount of time.
2728
auto const kDataSourceShutdownWait = std::chrono::milliseconds(100);
2829

30+
using config::shared::ClientSDK;
2931
using launchdarkly::client_side::data_sources::DataSourceStatus;
32+
using launchdarkly::config::shared::built::DataSourceConfig;
33+
using launchdarkly::config::shared::built::HttpProperties;
3034

3135
static std::shared_ptr<IDataSource> MakeDataSource(
36+
HttpProperties const& http_properties,
37+
std::optional<std::string> app_tags,
3238
Config const& config,
3339
Context const& context,
3440
boost::asio::any_io_executor const& executor,
@@ -39,15 +45,29 @@ static std::shared_ptr<IDataSource> MakeDataSource(
3945
return std::make_shared<data_sources::NullDataSource>(executor,
4046
status_manager);
4147
}
48+
49+
auto builder = HttpPropertiesBuilder(http_properties);
50+
51+
// Event sources should include application tags.
52+
if (app_tags) {
53+
builder.Header("x-launchdarkly-tags", *app_tags);
54+
}
55+
56+
auto data_source_properties = builder.Build();
57+
4258
if (config.DataSourceConfig().method.index() == 0) {
4359
// TODO: use initial reconnect delay.
4460
return std::make_shared<
4561
launchdarkly::client_side::data_sources::StreamingDataSource>(
46-
config, executor, context, flag_updater, status_manager, logger);
62+
config.ServiceEndpoints(), config.DataSourceConfig(),
63+
data_source_properties, executor, context, flag_updater,
64+
status_manager, logger);
4765
}
4866
return std::make_shared<
4967
launchdarkly::client_side::data_sources::PollingDataSource>(
50-
config, executor, context, flag_updater, status_manager, logger);
68+
config.ServiceEndpoints(), config.DataSourceConfig(),
69+
data_source_properties, executor, context, flag_updater, status_manager,
70+
logger);
5171
}
5272

5373
static Logger MakeLogger(config::shared::built::Logging const& config) {
@@ -69,8 +89,14 @@ static std::shared_ptr<IPersistence> MakePersistence(Config const& config) {
6989
return persistence.implementation;
7090
}
7191

72-
ClientImpl::ClientImpl(Config config, Context context)
92+
ClientImpl::ClientImpl(Config config,
93+
Context context,
94+
std::string const& version)
7395
: config_(config),
96+
http_properties_(HttpPropertiesBuilder(config.HttpProperties())
97+
.Header("user-agent", "CPPClient/" + version)
98+
.Header("authorization", config.SdkKey())
99+
.Build()),
74100
logger_(MakeLogger(config.Logging())),
75101
ioc_(kAsioConcurrencyHint),
76102
context_(std::move(context)),
@@ -79,7 +105,8 @@ ClientImpl::ClientImpl(Config config, Context context)
79105
config.Persistence().max_contexts_,
80106
MakePersistence(config)),
81107
data_source_factory_([this]() {
82-
return MakeDataSource(config_, context_, ioc_.get_executor(),
108+
return MakeDataSource(http_properties_, config_.ApplicationTag(),
109+
config_, context_, ioc_.get_executor(),
83110
flag_manager_.Updater(), status_manager_,
84111
logger_);
85112
}),
@@ -90,8 +117,9 @@ ClientImpl::ClientImpl(Config config, Context context)
90117
flag_manager_.LoadCache(context_);
91118

92119
if (config.Events().Enabled() && !config.Offline()) {
93-
event_processor_ = std::make_unique<EventProcessor>(ioc_.get_executor(),
94-
config, logger_);
120+
event_processor_ = std::make_unique<EventProcessor>(
121+
ioc_.get_executor(), config.ServiceEndpoints(), config.Events(),
122+
http_properties_, logger_);
95123
} else {
96124
event_processor_ = std::make_unique<NullEventProcessor>();
97125
}
@@ -181,8 +209,8 @@ std::future<void> ClientImpl::IdentifyAsync(Context context) {
181209
return fut;
182210
}
183211

184-
// TODO(cwaldren): refactor VariationInternal so it isn't so long and mixing up
185-
// multiple concerns.
212+
// TODO(cwaldren): refactor VariationInternal so it isn't so long and mixing
213+
// up multiple concerns.
186214
template <typename T>
187215
EvaluationDetail<T> ClientImpl::VariationInternal(FlagKey const& key,
188216
Value default_value,

libs/client-sdk/src/client_impl.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
namespace launchdarkly::client_side {
3030
class ClientImpl : public IClient {
3131
public:
32-
ClientImpl(Config config, Context context);
32+
ClientImpl(Config config, Context context, std::string const& version);
3333

3434
ClientImpl(ClientImpl&&) = delete;
3535
ClientImpl(ClientImpl const&) = delete;
@@ -87,7 +87,7 @@ class ClientImpl : public IClient {
8787

8888
void WaitForReadySync(std::chrono::milliseconds timeout) override;
8989

90-
~ClientImpl();
90+
~ClientImpl() override;
9191

9292
private:
9393
template <typename T>
@@ -110,6 +110,7 @@ class ClientImpl : public IClient {
110110

111111
Logger logger_;
112112
Config config_;
113+
launchdarkly::config::shared::built::HttpProperties http_properties_;
113114

114115
boost::asio::io_context ioc_;
115116

libs/client-sdk/src/data_sources/polling_data_source.cpp

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,17 @@ namespace launchdarkly::client_side::data_sources {
1515
static char const* const kCouldNotParseEndpoint =
1616
"Could not parse polling endpoint URL.";
1717

18-
static network::HttpRequest MakeRequest(Config const& config,
19-
Context const& context) {
20-
auto url = std::make_optional(config.ServiceEndpoints().PollingBaseUrl());
21-
22-
auto const& data_source_config = config.DataSourceConfig();
18+
static network::HttpRequest MakeRequest(
19+
config::shared::built::ServiceEndpoints const& endpoints,
20+
config::shared::built::DataSourceConfig<config::shared::ClientSDK>
21+
data_source_config,
22+
config::shared::built::HttpProperties const& http_properties,
23+
Context const& context) {
24+
auto url = std::make_optional(endpoints.PollingBaseUrl());
2325

2426
auto const& polling_config = std::get<
2527
config::shared::built::PollingConfig<config::shared::ClientSDK>>(
26-
config.DataSourceConfig().method);
28+
data_source_config.method);
2729

2830
auto string_context =
2931
boost::json::serialize(boost::json::value_from(context));
@@ -54,24 +56,22 @@ static network::HttpRequest MakeRequest(Config const& config,
5456
}
5557

5658
config::shared::builders::HttpPropertiesBuilder<config::shared::ClientSDK>
57-
builder(config.HttpProperties());
58-
59-
builder.Header("authorization", config.SdkKey());
60-
61-
if (auto app_tag = config.ApplicationTag()) {
62-
builder.Header("x-launchdarkly-tags", *app_tag);
63-
}
59+
builder(http_properties);
6460

6561
// If no URL is set, then we will fail the request.
6662
return {url.value_or(""), method, builder.Build(), body};
6763
}
6864

69-
PollingDataSource::PollingDataSource(Config const& config,
70-
boost::asio::any_io_executor ioc,
71-
Context const& context,
72-
IDataSourceUpdateSink& handler,
73-
DataSourceStatusManager& status_manager,
74-
Logger const& logger)
65+
PollingDataSource::PollingDataSource(
66+
config::shared::built::ServiceEndpoints const& endpoints,
67+
config::shared::built::DataSourceConfig<config::shared::ClientSDK> const&
68+
data_source_config,
69+
config::shared::built::HttpProperties const& http_properties,
70+
boost::asio::any_io_executor ioc,
71+
Context const& context,
72+
IDataSourceUpdateSink& handler,
73+
DataSourceStatusManager& status_manager,
74+
Logger const& logger)
7575
: ioc_(ioc),
7676
logger_(logger),
7777
status_manager_(status_manager),
@@ -82,12 +82,15 @@ PollingDataSource::PollingDataSource(Config const& config,
8282
polling_interval_(
8383
std::get<
8484
config::shared::built::PollingConfig<config::shared::ClientSDK>>(
85-
config.DataSourceConfig().method)
85+
data_source_config.method)
8686
.poll_interval),
87-
request_(MakeRequest(config, context)) {
87+
request_(MakeRequest(endpoints,
88+
data_source_config,
89+
http_properties,
90+
context)) {
8891
auto const& polling_config = std::get<
8992
config::shared::built::PollingConfig<config::shared::ClientSDK>>(
90-
config.DataSourceConfig().method);
93+
data_source_config.method);
9194
if (polling_interval_ < polling_config.min_polling_interval) {
9295
LD_LOG(logger_, LogLevel::kWarn)
9396
<< "Polling interval specified under minimum, defaulting to 30 "

libs/client-sdk/src/data_sources/polling_data_source.hpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99
#include "data_source_status_manager.hpp"
1010
#include "data_source_update_sink.hpp"
1111

12-
#include <launchdarkly/config/client.hpp>
12+
#include <launchdarkly/config/shared/built/data_source_config.hpp>
1313
#include <launchdarkly/config/shared/built/http_properties.hpp>
14+
#include <launchdarkly/config/shared/built/service_endpoints.hpp>
1415
#include <launchdarkly/logging/logger.hpp>
1516
#include <launchdarkly/network/asio_requester.hpp>
1617

@@ -20,12 +21,16 @@ class PollingDataSource
2021
: public IDataSource,
2122
public std::enable_shared_from_this<PollingDataSource> {
2223
public:
23-
PollingDataSource(Config const& config,
24-
boost::asio::any_io_executor ioc,
25-
Context const& context,
26-
IDataSourceUpdateSink& handler,
27-
DataSourceStatusManager& status_manager,
28-
Logger const& logger);
24+
PollingDataSource(
25+
config::shared::built::ServiceEndpoints const& endpoints,
26+
config::shared::built::DataSourceConfig<
27+
config::shared::ClientSDK> const& data_source_config,
28+
config::shared::built::HttpProperties const& http_properties,
29+
boost::asio::any_io_executor ioc,
30+
Context const& context,
31+
IDataSourceUpdateSink& handler,
32+
DataSourceStatusManager& status_manager,
33+
Logger const& logger);
2934

3035
void Start() override;
3136
void ShutdownAsync(std::function<void()>) override;

libs/client-sdk/src/data_sources/streaming_data_source.cpp

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ static char const* const kCouldNotParseEndpoint =
1919
"Could not parse streaming endpoint URL.";
2020

2121
StreamingDataSource::StreamingDataSource(
22-
Config const& config,
22+
config::shared::built::ServiceEndpoints const& endpoints,
23+
config::shared::built::DataSourceConfig<config::shared::ClientSDK> const&
24+
data_source_config,
25+
config::shared::built::HttpProperties const& http_properties,
2326
boost::asio::any_io_executor ioc,
2427
Context context,
2528
IDataSourceUpdateSink& handler,
@@ -31,11 +34,9 @@ StreamingDataSource::StreamingDataSource(
3134
status_manager_(status_manager),
3235
data_source_handler_(
3336
DataSourceEventHandler(context_, handler, logger, status_manager_)),
34-
http_config_(config.HttpProperties()),
35-
data_source_config_(config.DataSourceConfig()),
36-
app_tags_(config.ApplicationTag()),
37-
sdk_key_(config.SdkKey()),
38-
streaming_endpoint_(config.ServiceEndpoints().StreamingBaseUrl()) {}
37+
http_config_(http_properties),
38+
data_source_config_(data_source_config),
39+
streaming_endpoint_(endpoints.StreamingBaseUrl()) {}
3940

4041
void StreamingDataSource::Start() {
4142
status_manager_.SetState(DataSourceStatus::DataSourceState::kInitializing);
@@ -104,15 +105,9 @@ void StreamingDataSource::Start() {
104105

105106
client_builder.connect_timeout(http_config_.ConnectTimeout());
106107

107-
client_builder.header("authorization", sdk_key_);
108108
for (auto const& header : http_config_.BaseHeaders()) {
109109
client_builder.header(header.first, header.second);
110110
}
111-
client_builder.header("user-agent", http_config_.UserAgent());
112-
113-
if (app_tags_) {
114-
client_builder.header("x-launchdarkly-tags", *app_tags_);
115-
}
116111

117112
// TODO: Handle proxy support.
118113

libs/client-sdk/src/data_sources/streaming_data_source.hpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ using namespace std::chrono_literals;
99
#include "data_source_event_handler.hpp"
1010
#include "data_source_status_manager.hpp"
1111
#include "data_source_update_sink.hpp"
12+
#include "launchdarkly/config/shared/sdks.hpp"
1213

13-
#include <launchdarkly/config/client.hpp>
14+
#include <launchdarkly/config/shared/built/data_source_config.hpp>
1415
#include <launchdarkly/config/shared/built/http_properties.hpp>
1516
#include <launchdarkly/config/shared/built/service_endpoints.hpp>
1617
#include <launchdarkly/context.hpp>
@@ -24,12 +25,16 @@ class StreamingDataSource final
2425
: public IDataSource,
2526
public std::enable_shared_from_this<StreamingDataSource> {
2627
public:
27-
StreamingDataSource(Config const& config,
28-
boost::asio::any_io_executor ioc,
29-
Context context,
30-
IDataSourceUpdateSink& handler,
31-
DataSourceStatusManager& status_manager,
32-
Logger const& logger);
28+
StreamingDataSource(
29+
config::shared::built::ServiceEndpoints const& endpoints,
30+
config::shared::built::DataSourceConfig<
31+
config::shared::ClientSDK> const& data_source_config,
32+
config::shared::built::HttpProperties const& http_properties,
33+
boost::asio::any_io_executor ioc,
34+
Context context,
35+
IDataSourceUpdateSink& handler,
36+
DataSourceStatusManager& status_manager,
37+
Logger const& logger);
3338

3439
void Start() override;
3540
void ShutdownAsync(std::function<void()>) override;
@@ -47,10 +52,6 @@ class StreamingDataSource final
4752

4853
config::shared::built::HttpProperties http_config_;
4954

50-
std::optional<std::string> app_tags_;
51-
52-
std::string sdk_key_;
53-
5455
Logger const& logger_;
5556
std::shared_ptr<launchdarkly::sse::Client> client_;
5657
};

libs/client-sdk/src/event_processor/event_processor.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
namespace launchdarkly::client_side {
44

5-
EventProcessor::EventProcessor(boost::asio::any_io_executor const& io,
6-
Config const& config,
7-
Logger& logger)
8-
: impl_(io, config, logger) {}
5+
EventProcessor::EventProcessor(
6+
boost::asio::any_io_executor const& io,
7+
config::shared::built::ServiceEndpoints const& endpoints,
8+
config::shared::built::Events const& events_config,
9+
config::shared::built::HttpProperties const& http_properties,
10+
Logger& logger)
11+
: impl_(io, endpoints, events_config, http_properties, logger) {}
912

1013
void EventProcessor::SendAsync(events::InputEvent event) {
1114
impl_.AsyncSend(std::move(event));

libs/client-sdk/src/event_processor/event_processor.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ namespace launchdarkly::client_side {
1414
class EventProcessor : public IEventProcessor {
1515
public:
1616
EventProcessor(boost::asio::any_io_executor const& io,
17-
Config const& config,
17+
config::shared::built::ServiceEndpoints const& endpoints,
18+
config::shared::built::Events const& events_config,
19+
config::shared::built::HttpProperties const& http_properties,
1820
Logger& logger);
1921
void SendAsync(events::InputEvent event) override;
2022
void FlushAsync() override;

libs/common/include/launchdarkly/config/shared/builders/http_properties_builder.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ class HttpPropertiesBuilder {
129129
std::string wrapper_name_;
130130
std::string wrapper_version_;
131131
std::map<std::string, std::string> base_headers_;
132-
std::string user_agent_;
133132
};
134133

135134
} // namespace launchdarkly::config::shared::builders

0 commit comments

Comments
 (0)