diff --git a/contract-tests/client-contract-tests/src/entity_manager.cpp b/contract-tests/client-contract-tests/src/entity_manager.cpp index 2bb833926..9a76e4821 100644 --- a/contract-tests/client-contract-tests/src/entity_manager.cpp +++ b/contract-tests/client-contract-tests/src/entity_manager.cpp @@ -146,6 +146,15 @@ std::optional EntityManager::create(ConfigParams const& in) { config_builder.HttpProperties().Tls(std::move(builder)); } + if (in.wrapper) { + if (!in.wrapper->name.empty()) { + config_builder.HttpProperties().WrapperName(in.wrapper->name); + } + if (!in.wrapper->version.empty()) { + config_builder.HttpProperties().WrapperVersion(in.wrapper->version); + } + } + auto config = config_builder.Build(); if (!config) { LD_LOG(logger_, LogLevel::kWarn) diff --git a/contract-tests/client-contract-tests/src/main.cpp b/contract-tests/client-contract-tests/src/main.cpp index 9b2d4cada..7b5a878ae 100644 --- a/contract-tests/client-contract-tests/src/main.cpp +++ b/contract-tests/client-contract-tests/src/main.cpp @@ -47,6 +47,7 @@ int main(int argc, char* argv[]) { srv.add_capability("tls:skip-verify-peer"); srv.add_capability("tls:custom-ca"); srv.add_capability("client-prereq-events"); + srv.add_capability("wrapper"); // Proxies are supported only with CURL networking. #ifdef LD_CURL_NETWORKING srv.add_capability("http-proxy"); diff --git a/contract-tests/data-model/include/data_model/data_model.hpp b/contract-tests/data-model/include/data_model/data_model.hpp index 31413de32..679fd0015 100644 --- a/contract-tests/data-model/include/data_model/data_model.hpp +++ b/contract-tests/data-model/include/data_model/data_model.hpp @@ -143,6 +143,13 @@ struct ConfigHooksParams { NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(ConfigHooksParams, hooks); +struct ConfigWrapper { + std::string name; + std::string version; +}; + +NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(ConfigWrapper, name, version); + struct ConfigParams { std::string credential; std::optional startWaitTimeMs; @@ -156,6 +163,7 @@ struct ConfigParams { std::optional tls; std::optional proxy; std::optional hooks; + std::optional wrapper; }; NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(ConfigParams, @@ -170,7 +178,8 @@ NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(ConfigParams, tags, tls, proxy, - hooks); + hooks, + wrapper); struct ContextSingleParams { std::optional kind; diff --git a/contract-tests/server-contract-tests/src/entity_manager.cpp b/contract-tests/server-contract-tests/src/entity_manager.cpp index 8c8fb7c21..085df1c2d 100644 --- a/contract-tests/server-contract-tests/src/entity_manager.cpp +++ b/contract-tests/server-contract-tests/src/entity_manager.cpp @@ -145,6 +145,15 @@ std::optional EntityManager::create(ConfigParams const& in) { } } + if (in.wrapper) { + if (!in.wrapper->name.empty()) { + config_builder.HttpProperties().WrapperName(in.wrapper->name); + } + if (!in.wrapper->version.empty()) { + config_builder.HttpProperties().WrapperVersion(in.wrapper->version); + } + } + auto config = config_builder.Build(); if (!config) { LD_LOG(logger_, LogLevel::kWarn) diff --git a/contract-tests/server-contract-tests/src/main.cpp b/contract-tests/server-contract-tests/src/main.cpp index 8584c35ea..e017a8634 100644 --- a/contract-tests/server-contract-tests/src/main.cpp +++ b/contract-tests/server-contract-tests/src/main.cpp @@ -50,6 +50,7 @@ int main(int argc, char* argv[]) { srv.add_capability("client-prereq-events"); srv.add_capability("evaluation-hooks"); srv.add_capability("track-hooks"); + srv.add_capability("wrapper"); net::signal_set signals{ioc, SIGINT, SIGTERM}; diff --git a/libs/common/src/config/http_properties_builder.cpp b/libs/common/src/config/http_properties_builder.cpp index df5b31c65..43d45b41a 100644 --- a/libs/common/src/config/http_properties_builder.cpp +++ b/libs/common/src/config/http_properties_builder.cpp @@ -133,8 +133,12 @@ template built::HttpProperties HttpPropertiesBuilder::Build() const { if (!wrapper_name_.empty()) { std::map headers_with_wrapper(base_headers_); - headers_with_wrapper["X-LaunchDarkly-Wrapper"] = - wrapper_name_ + "/" + wrapper_version_; + if (wrapper_version_.empty()) { + headers_with_wrapper["X-LaunchDarkly-Wrapper"] = wrapper_name_; + } else { + headers_with_wrapper["X-LaunchDarkly-Wrapper"] = + wrapper_name_ + "/" + wrapper_version_; + } return {connect_timeout_, read_timeout_, write_timeout_, response_timeout_, headers_with_wrapper, tls_.Build(), proxy_}; }