Skip to content

Commit 3f2f9ba

Browse files
Add extra checks for baggage header parsing (#1010)
* Avoid IndexOutOfBoundsException * Add extra checks for baggage header parsing + tests --------- Co-authored-by: Jonatan Ivanov <[email protected]>
1 parent 22ca8fd commit 3f2f9ba

File tree

2 files changed

+61
-16
lines changed

2 files changed

+61
-16
lines changed

micrometer-tracing-bridges/micrometer-tracing-bridge-brave/src/main/java/io/micrometer/tracing/brave/bridge/W3CPropagation.java

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -257,20 +257,27 @@ List<AbstractMap.SimpleEntry<Baggage, String>> addBaggageToContext(String baggag
257257
entry = entry.substring(0, beginningOfMetadata);
258258
}
259259
String[] keyAndValue = entry.split("=");
260-
for (int i = 0; i < keyAndValue.length; i += 2) {
261-
try {
262-
String key = keyAndValue[i].trim();
263-
String value = keyAndValue[i + 1].trim();
264-
Baggage baggage = this.braveBaggageManager.createBaggage(key);
265-
pairs.add(new AbstractMap.SimpleEntry<>(baggage, value));
266-
}
267-
catch (Exception e) {
268-
if (log.isDebugEnabled()) {
269-
log.debug("Exception occurred while trying to parse baggage with key value ["
270-
+ Arrays.toString(keyAndValue) + "]. Will ignore that entry.", e);
260+
if (keyAndValue.length % 2 == 0) {
261+
for (int i = 0; i < keyAndValue.length - 1; i += 2) {
262+
try {
263+
String key = keyAndValue[i].trim();
264+
String value = keyAndValue[i + 1].trim();
265+
Baggage baggage = this.braveBaggageManager.createBaggage(key);
266+
pairs.add(new AbstractMap.SimpleEntry<>(baggage, value));
267+
}
268+
catch (Exception e) {
269+
if (log.isDebugEnabled()) {
270+
log.debug("Exception occurred while trying to parse baggage with key value "
271+
+ Arrays.toString(keyAndValue) + ". Will ignore that entry.", e);
272+
}
271273
}
272274
}
273275
}
276+
else if (log.isDebugEnabled()) {
277+
log.debug(
278+
"Unable to to parse baggage with key value since it seems something is not in key=value format: "
279+
+ Arrays.toString(keyAndValue) + ". Will ignore that entry.");
280+
}
274281
}
275282
return pairs;
276283
}

micrometer-tracing-bridges/micrometer-tracing-bridge-brave/src/test/java/io/micrometer/tracing/brave/bridge/W3CBaggagePropagatorTest.java

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import io.micrometer.tracing.Tracer;
2828
import io.micrometer.tracing.handler.DefaultTracingObservationHandler;
2929
import io.micrometer.tracing.handler.PropagatingReceiverTracingObservationHandler;
30-
import org.junit.jupiter.api.Disabled;
3130
import org.junit.jupiter.api.Test;
3231
import org.slf4j.MDC;
3332

@@ -36,6 +35,7 @@
3635

3736
import static java.util.Collections.singletonMap;
3837
import static org.assertj.core.api.Assertions.assertThat;
38+
import static org.assertj.core.api.Assertions.entry;
3939

4040
/**
4141
* Test taken from OpenTelemetry.
@@ -74,6 +74,46 @@ void extract_emptyBaggageHeader() {
7474
assertThat(contextWithBaggage).isEqualTo(contextWithBraveBaggageFields(context));
7575
}
7676

77+
@Test
78+
void extract_metadataOnlyBaggageHeader() {
79+
TraceContextOrSamplingFlags context = context();
80+
Map<String, String> carrier = new HashMap<>();
81+
carrier.put("baggage", ";metadata");
82+
83+
TraceContextOrSamplingFlags contextWithBaggage = propagator.contextWithBaggage(carrier, context, Map::get);
84+
assertThat(baggageEntries(contextWithBaggage)).isEmpty();
85+
}
86+
87+
@Test
88+
void extract_noValueBaggageHeader() {
89+
TraceContextOrSamplingFlags context = context();
90+
Map<String, String> carrier = new HashMap<>();
91+
carrier.put("baggage", "a=");
92+
93+
TraceContextOrSamplingFlags contextWithBaggage = propagator.contextWithBaggage(carrier, context, Map::get);
94+
assertThat(baggageEntries(contextWithBaggage)).isEmpty();
95+
}
96+
97+
@Test
98+
void extract_noValueButMetadataBaggageHeader() {
99+
TraceContextOrSamplingFlags context = context();
100+
Map<String, String> carrier = new HashMap<>();
101+
carrier.put("baggage", "a=;metadata");
102+
103+
TraceContextOrSamplingFlags contextWithBaggage = propagator.contextWithBaggage(carrier, context, Map::get);
104+
assertThat(baggageEntries(contextWithBaggage)).isEmpty();
105+
}
106+
107+
@Test
108+
void extract_keyValuesNotinPairBaggageHeader() {
109+
TraceContextOrSamplingFlags context = context();
110+
Map<String, String> carrier = new HashMap<>();
111+
carrier.put("baggage", "a=b,oops,c=,=d,=");
112+
113+
TraceContextOrSamplingFlags contextWithBaggage = propagator.contextWithBaggage(carrier, context, Map::get);
114+
assertThat(baggageEntries(contextWithBaggage)).containsExactly(entry("a", "b"));
115+
}
116+
77117
@Test
78118
void extract_singleEntry() {
79119
TraceContextOrSamplingFlags context = context();
@@ -147,17 +187,15 @@ private Map<String, String> baggageEntries(TraceContextOrSamplingFlags flags) {
147187
* data, to make sure we don't blow up with it.
148188
*/
149189
@Test
150-
@Disabled("We don't support additional data")
151190
void extract_invalidHeader() {
152191
TraceContextOrSamplingFlags context = context();
153192
Map<String, String> carrier = new HashMap<>();
154193
carrier.put("baggage", "key1= v;alsdf;-asdflkjasdf===asdlfkjadsf ,,a sdf9asdf-alue1; metadata-key = "
155194
+ "value; othermetadata, key2 =value2 , key3 =\tvalue3 ; ");
156195

157196
TraceContextOrSamplingFlags contextWithBaggage = propagator.contextWithBaggage(carrier, context, Map::get);
158-
159-
Map<String, String> baggageEntries = baggageEntries(contextWithBaggage);
160-
assertThat(baggageEntries).isEmpty();
197+
assertThat(baggageEntries(contextWithBaggage)).containsExactly(entry("key1", "v"), entry("key2", "value2"),
198+
entry("key3", "value3"));
161199
}
162200

163201
@Test

0 commit comments

Comments
 (0)