From 9ba35cee3088cd9ca6aa9b3f246209798046b779 Mon Sep 17 00:00:00 2001 From: Eunbin Son Date: Sat, 20 Jun 2026 15:11:52 +0900 Subject: [PATCH] Fix Jaeger propagator baggage header case sensitivity --- CHANGELOG.md | 6 ++++++ .../trace/propagation/JaegerPropagator.java | 10 ++++++---- .../trace/propagation/JaegerPropagatorTest.java | 17 +++++++++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c399e74acfa..f42c74e8192 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## Unreleased +### API + +#### Extensions + +* Trace propagators: Match Jaeger baggage header keys case insensitively + ## Version 1.63.0 (2026-06-05) ### API diff --git a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java index c19a2793fcf..4acebd2c399 100644 --- a/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java +++ b/extensions/trace-propagators/src/main/java/io/opentelemetry/extension/trace/propagation/JaegerPropagator.java @@ -25,6 +25,7 @@ import java.nio.charset.StandardCharsets; import java.util.Collection; import java.util.Collections; +import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.Nullable; @@ -255,13 +256,14 @@ private static Baggage getBaggageFromHeader(@Nullable C carrier, TextMapGett if (entriesAdded >= MAX_BAGGAGE_ENTRIES || bytesAdded > MAX_BAGGAGE_BYTES) { break; } - if (key.startsWith(BAGGAGE_PREFIX)) { - if (key.length() == BAGGAGE_PREFIX.length()) { + String lowercaseKey = key.toLowerCase(Locale.ROOT); + if (lowercaseKey.startsWith(BAGGAGE_PREFIX)) { + if (lowercaseKey.length() == BAGGAGE_PREFIX.length()) { continue; } String value = getter.get(carrier, key); if (value != null) { - String baggageKey = key.substring(BAGGAGE_PREFIX.length()); + String baggageKey = lowercaseKey.substring(BAGGAGE_PREFIX.length()); if (bytesAdded + baggageKey.length() + value.length() > MAX_BAGGAGE_BYTES) { break; } @@ -272,7 +274,7 @@ private static Baggage getBaggageFromHeader(@Nullable C carrier, TextMapGett entriesAdded++; bytesAdded += baggageKey.length() + value.length(); } - } else if (key.equals(BAGGAGE_HEADER)) { + } else if (lowercaseKey.equals(BAGGAGE_HEADER)) { String value = getter.get(carrier, key); if (value != null) { if (builder == null) { diff --git a/extensions/trace-propagators/src/test/java/io/opentelemetry/extension/trace/propagation/JaegerPropagatorTest.java b/extensions/trace-propagators/src/test/java/io/opentelemetry/extension/trace/propagation/JaegerPropagatorTest.java index 20bb2b7f13d..b2dca3e5f7a 100644 --- a/extensions/trace-propagators/src/test/java/io/opentelemetry/extension/trace/propagation/JaegerPropagatorTest.java +++ b/extensions/trace-propagators/src/test/java/io/opentelemetry/extension/trace/propagation/JaegerPropagatorTest.java @@ -457,6 +457,23 @@ void extract_baggageOnly_withHeader_andPrefix() { .build()); } + @Test + void extract_baggageOnly_capitalizedHeaders() { + Map carrier = new LinkedHashMap<>(); + // Some TextMapGetters return header keys in their original case (e.g. undertow 1.7), so baggage + // matching must be case insensitive. + carrier.put("Uberctx-some-key", "value"); + carrier.put("Jaeger-Baggage", "nometa=nometa-value,meta=meta-value"); + + assertThat(fromContext(jaegerPropagator.extract(Context.current(), carrier, getter))) + .isEqualTo( + Baggage.builder() + .put("some-key", "value") + .put("nometa", "nometa-value") + .put("meta", "meta-value") + .build()); + } + @Test void extract_nullContext() { assertThat(jaegerPropagator.extract(null, Collections.emptyMap(), getter))