diff --git a/sdk/core/azure-core/inc/azure/core/http/policies/policy.hpp b/sdk/core/azure-core/inc/azure/core/http/policies/policy.hpp index b52b807fd..bbd6db90a 100644 --- a/sdk/core/azure-core/inc/azure/core/http/policies/policy.hpp +++ b/sdk/core/azure-core/inc/azure/core/http/policies/policy.hpp @@ -430,9 +430,12 @@ namespace Azure { namespace Core { namespace Http { namespace Policies { NextHttpPolicy nextPolicy, Context const& context) const override { - auto uuid = Uuid::CreateUuid().ToString(); + if (!request.GetHeader(RequestIdHeader).HasValue()) + { + auto const uuid = Uuid::CreateUuid().ToString(); + request.SetHeader(RequestIdHeader, uuid); + } - request.SetHeader(RequestIdHeader, uuid); return nextPolicy.Send(request, context); } }; diff --git a/sdk/core/azure-core/src/http/telemetry_policy.cpp b/sdk/core/azure-core/src/http/telemetry_policy.cpp index 6e17ef576..fadbb1235 100644 --- a/sdk/core/azure-core/src/http/telemetry_policy.cpp +++ b/sdk/core/azure-core/src/http/telemetry_policy.cpp @@ -13,6 +13,12 @@ std::unique_ptr Azure::Core::Http::Policies::_internal::TelemetryPo NextHttpPolicy nextPolicy, Context const& context) const { - request.SetHeader("User-Agent", m_telemetryId); + static std::string const UserAgent{"User-Agent"}; + + if (!request.GetHeader(UserAgent).HasValue()) + { + request.SetHeader(UserAgent, m_telemetryId); + } + return nextPolicy.Send(request, context); } diff --git a/sdk/core/azure-core/test/ut/request_id_policy_test.cpp b/sdk/core/azure-core/test/ut/request_id_policy_test.cpp index ee9776768..2901d25fb 100644 --- a/sdk/core/azure-core/test/ut/request_id_policy_test.cpp +++ b/sdk/core/azure-core/test/ut/request_id_policy_test.cpp @@ -92,3 +92,24 @@ TEST(RequestIdPolicy, Unique) EXPECT_NE(guid1, guid2); } + +TEST(RequestIdPolicy, NoOverwrite) +{ + Request request(HttpMethod::Get, Url("https://www.microsoft.com")); + request.SetHeader("x-ms-client-request-id", "0123-45-67-89-abcdef"); + + { + std::vector> policies; + + policies.emplace_back(std::make_unique()); + policies.emplace_back(std::make_unique()); + + Azure::Core::Http::_internal::HttpPipeline(policies).Send(request, Azure::Core::Context()); + } + + auto const headers = request.GetHeaders(); + auto const requestIdHeader = headers.find("x-ms-client-request-id"); + + EXPECT_NE(requestIdHeader, headers.end()); + EXPECT_EQ(requestIdHeader->second, "0123-45-67-89-abcdef"); +} diff --git a/sdk/core/azure-core/test/ut/telemetry_policy_test.cpp b/sdk/core/azure-core/test/ut/telemetry_policy_test.cpp index bfc1dddc6..ee4e4b675 100644 --- a/sdk/core/azure-core/test/ut/telemetry_policy_test.cpp +++ b/sdk/core/azure-core/test/ut/telemetry_policy_test.cpp @@ -85,3 +85,24 @@ TEST(TelemetryPolicy, telemetryString) EXPECT_EQ(actualValue.substr(0, test.expectedPrefix.size()), test.expectedPrefix); } } + +TEST(TelemetryPolicy, NoOverwrite) +{ + Request request(HttpMethod::Get, Url("https://www.microsoft.com")); + request.SetHeader("User-Agent", "do not touch"); + + { + std::vector> policies; + + policies.emplace_back(std::make_unique("test", "1.0.0")); + policies.emplace_back(std::make_unique()); + + Azure::Core::Http::_internal::HttpPipeline(policies).Send(request, Azure::Core::Context()); + } + + auto const headers = request.GetHeaders(); + auto const requestIdHeader = headers.find("User-Agent"); + + EXPECT_NE(requestIdHeader, headers.end()); + EXPECT_EQ(requestIdHeader->second, "do not touch"); +}