diff --git a/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/Parser.java b/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/Parser.java index dfd6977a42d..65dae9efdf0 100644 --- a/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/Parser.java +++ b/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/Parser.java @@ -8,6 +8,7 @@ import io.opentelemetry.api.baggage.BaggageBuilder; import io.opentelemetry.api.baggage.BaggageEntryMetadata; import java.nio.charset.StandardCharsets; +import java.util.logging.Logger; import javax.annotation.Nullable; /** @@ -20,6 +21,8 @@ */ class Parser { + private static final Logger LOGGER = Logger.getLogger(Parser.class.getName()); + private enum State { KEY, VALUE, @@ -140,8 +143,14 @@ private void putBaggage( if (entriesAdded >= maxEntries) { return; } - String decodedValue = decodeValue(value); - metadataValue = decodeValue(metadataValue); + String decodedValue; + try { + decodedValue = decodeValue(value); + metadataValue = decodeValue(metadataValue); + } catch (IllegalArgumentException e) { + LOGGER.warning("Invalid baggage member. Skipping member."); + return; + } BaggageEntryMetadata baggageEntryMetadata = metadataValue != null ? BaggageEntryMetadata.create(metadataValue) diff --git a/api/all/src/test/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagatorTest.java b/api/all/src/test/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagatorTest.java index b7b0b59cc1d..0ab33e81844 100644 --- a/api/all/src/test/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagatorTest.java +++ b/api/all/src/test/java/io/opentelemetry/api/baggage/propagation/W3CBaggagePropagatorTest.java @@ -439,6 +439,40 @@ void extract_member_someInvalid() { assertThat(Baggage.fromContext(result)).isEqualTo(expectedBaggage); } + @ParameterizedTest + @MethodSource + void extract_member_invalidPercentEncoding_preservesValidMembers( + String header, Baggage expectedBaggage) { + W3CBaggagePropagator propagator = W3CBaggagePropagator.getInstance(); + + Context result = propagator.extract(Context.root(), ImmutableMap.of("baggage", header), getter); + assertThat(Baggage.fromContext(result)).isEqualTo(expectedBaggage); + } + + static Stream extract_member_invalidPercentEncoding_preservesValidMembers() { + return Stream.of( + Arguments.argumentSet( + "invalid entry at beginning", + "bad=va%lue,key1=value1,encoded=value%202", + Baggage.builder().put("key1", "value1").put("encoded", "value 2").build()), + Arguments.argumentSet( + "invalid entry in middle", + "key1=value1,bad=va%lue,encoded=value%202,key2=value2", + Baggage.builder() + .put("key1", "value1") + .put("encoded", "value 2") + .put("key2", "value2") + .build()), + Arguments.argumentSet( + "invalid entry at end", + "key1=value1,encoded=value%202,bad=va%lue", + Baggage.builder().put("key1", "value1").put("encoded", "value 2").build()), + Arguments.argumentSet( + "multiple invalid entries", + "bad1=va%lue,key1=value1,bad2=value%GG,encoded=value%202,bad3=value;meta=%GG", + Baggage.builder().put("key1", "value1").put("encoded", "value 2").build())); + } + @Test void extract_nullContext() { assertThat(W3CBaggagePropagator.getInstance().extract(null, Collections.emptyMap(), getter))