From 59a48c1c99bbc8822d66eaf9edbe3f384092b125 Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Tue, 3 May 2022 17:26:43 -0700 Subject: [PATCH] fix baggage propagation for empty/invalid baggage context (#1367) --- .../baggage/propagation/baggage_propagator.h | 16 ++++++++-- .../propagation/baggage_propagator_test.cc | 29 +++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/api/include/opentelemetry/baggage/propagation/baggage_propagator.h b/api/include/opentelemetry/baggage/propagation/baggage_propagator.h index 11abd3107e..3de60860b2 100644 --- a/api/include/opentelemetry/baggage/propagation/baggage_propagator.h +++ b/api/include/opentelemetry/baggage/propagation/baggage_propagator.h @@ -21,7 +21,11 @@ class BaggagePropagator : public opentelemetry::context::propagation::TextMapPro const opentelemetry::context::Context &context) noexcept override { auto baggage = opentelemetry::baggage::GetBaggage(context); - carrier.Set(kBaggageHeader, baggage->ToHeader()); + auto header = baggage->ToHeader(); + if (header.size()) + { + carrier.Set(kBaggageHeader, header); + } } context::Context Extract(const opentelemetry::context::propagation::TextMapCarrier &carrier, @@ -29,7 +33,15 @@ class BaggagePropagator : public opentelemetry::context::propagation::TextMapPro { nostd::string_view baggage_str = carrier.Get(opentelemetry::baggage::kBaggageHeader); auto baggage = opentelemetry::baggage::Baggage::FromHeader(baggage_str); - return opentelemetry::baggage::SetBaggage(context, baggage); + + if (baggage->ToHeader().size()) + { + return opentelemetry::baggage::SetBaggage(context, baggage); + } + else + { + return context; + } } bool Fields(nostd::function_ref callback) const noexcept override diff --git a/api/test/baggage/propagation/baggage_propagator_test.cc b/api/test/baggage/propagation/baggage_propagator_test.cc index 0f1f8f338c..94fe8b005b 100644 --- a/api/test/baggage/propagation/baggage_propagator_test.cc +++ b/api/test/baggage/propagation/baggage_propagator_test.cc @@ -82,3 +82,32 @@ TEST(BaggagePropagatorTest, ExtractAndInjectBaggage) EXPECT_EQ(fields[0], baggage::kBaggageHeader.data()); } } + +TEST(BaggagePropagatorTest, InjectEmptyHeader) +{ + // Test Missing baggage from context + BaggageCarrierTest carrier; + context::Context ctx = context::Context{}; + format.Inject(carrier, ctx); + EXPECT_EQ(carrier.headers_.find(baggage::kBaggageHeader), carrier.headers_.end()); + + { + // Test empty baggage in context + BaggageCarrierTest carrier1; + carrier1.headers_[baggage::kBaggageHeader.data()] = ""; + context::Context ctx1 = context::Context{}; + context::Context ctx2 = format.Extract(carrier1, ctx1); + format.Inject(carrier, ctx2); + EXPECT_EQ(carrier.headers_.find(baggage::kBaggageHeader), carrier.headers_.end()); + } + { + // Invalid baggage in context + BaggageCarrierTest carrier1; + carrier1.headers_[baggage::kBaggageHeader.data()] = "InvalidBaggageData"; + context::Context ctx1 = context::Context{}; + context::Context ctx2 = format.Extract(carrier1, ctx1); + + format.Inject(carrier, ctx2); + EXPECT_EQ(carrier.headers_.find(baggage::kBaggageHeader), carrier.headers_.end()); + } +}