Skip to content

Commit 6b1cc37

Browse files
committed
Still relay elements we couldn't parse, as downstream tracers might handle them
1 parent 6fa097a commit 6b1cc37

2 files changed

Lines changed: 28 additions & 33 deletions

File tree

dd-trace-core/src/main/java/datadog/trace/core/propagation/ptags/W3CPTagsCodec.java

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,9 @@ PropagationTags fromHeaderValue(PTagsFactory tagsFactory, String value) {
113113
false,
114114
W3CPTagsCodec::isAllowedKeyChar);
115115
if (tagKeyEndsAt < 0 || tagKeyEndsAt >= ddMemberValueEnd) {
116-
tagPos = skipMalformedElement(value, tagPos, ddMemberValueEnd);
116+
int nextTagPos = skipMalformedElement(value, tagPos, ddMemberValueEnd);
117+
maxUnknownSize += (nextTagPos - tagPos); // still relay malformed elements
118+
tagPos = nextTagPos;
117119
continue;
118120
}
119121
int tagValuePos = tagKeyEndsAt + 1;
@@ -126,7 +128,9 @@ PropagationTags fromHeaderValue(PTagsFactory tagsFactory, String value) {
126128
true,
127129
W3CPTagsCodec::isAllowedValueChar);
128130
if (tagValueEndsAt < 0 || tagValueEndsAt > ddMemberValueEnd) {
129-
tagPos = skipMalformedElement(value, tagValuePos, ddMemberValueEnd);
131+
int nextTagPos = skipMalformedElement(value, tagValuePos, ddMemberValueEnd);
132+
maxUnknownSize += (nextTagPos - tagPos); // still relay malformed elements
133+
tagPos = nextTagPos;
130134
continue;
131135
}
132136
int nextTagPos = tagValueEndsAt + 1;
@@ -658,33 +662,24 @@ private static int cleanUpAndAppendUnknown(StringBuilder sb, W3CPTags w3CPTags,
658662
}
659663
okSize = size;
660664
int elementEnd = original.indexOf(ELEMENT_SEPARATOR, elementStart);
661-
if (elementEnd < 0) {
665+
if (elementEnd < 0 || elementEnd > w3CPTags.ddMemberValueEnd) {
662666
elementEnd = w3CPTags.ddMemberValueEnd;
663667
}
664668
if (!original.startsWith(Encoding.W3C.getPrefix(), elementStart)) {
665-
int tagKeyEndsAt =
666-
validateCharsUntilSeparatorOrEnd(
667-
original,
668-
elementStart,
669-
elementEnd,
670-
KEY_VALUE_SEPARATOR,
671-
false,
672-
W3CPTagsCodec::isAllowedKeyChar);
673-
if (tagKeyEndsAt > elementStart && tagKeyEndsAt < elementEnd) {
674-
char first = original.charAt(elementStart);
675-
// ignore known o:, s:, and p: elements because we always add them back in appendPrefix
676-
if ((first != 'o' && first != 's' && first != 'p') || tagKeyEndsAt - elementStart != 1) {
677-
if (sb.length() > EMPTY_SIZE) {
678-
sb.append(ELEMENT_SEPARATOR);
679-
size++;
680-
}
681-
int end = elementEnd;
682-
if (end == w3CPTags.ddMemberValueEnd) {
683-
end = stripTrailingOWC(original, elementStart, end);
684-
}
685-
sb.append(original, elementStart, end);
686-
size += (end - elementStart);
669+
char first = original.charAt(elementStart);
670+
int keySize = original.indexOf(KEY_VALUE_SEPARATOR, elementStart) - elementStart;
671+
// ignore known o:, s:, and p: elements because we always add them back in appendPrefix
672+
if ((first != 'o' && first != 's' && first != 'p') || keySize != 1) {
673+
if (sb.length() > EMPTY_SIZE) {
674+
sb.append(ELEMENT_SEPARATOR);
675+
size++;
676+
}
677+
int end = elementEnd;
678+
if (end == w3CPTags.ddMemberValueEnd) {
679+
end = stripTrailingOWC(original, elementStart, end);
687680
}
681+
sb.append(original, elementStart, end);
682+
size += (end - elementStart);
688683
}
689684
}
690685
elementStart = elementEnd + 1;

dd-trace-core/src/test/java/datadog/trace/core/propagation/W3CPropagationTagsTest.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,8 @@ static IntStream memberCountArguments() {
285285
"2 seps then ws then sep is empty elem ws | 'dd=x:y;; ;z:w' | 'dd=x:y;z:w' | [:] ",
286286
"sampling unknown trailing sep then ws | 'dd=s:0;x:y; ' | 'dd=s:0;x:y' | [:] ",
287287
"sep then ws then sep is empty elem | 'dd=s:0; ;t.dm:934086a686-4' | 'dd=s:0;t.dm:934086a686-4' | [_dd.p.dm: 934086a686-4] ",
288-
"dd interior ws between submembers | 'dd=s:0;t.dm:934086a686-4; t.x:y' | 'dd=s:0;t.dm:934086a686-4' | [_dd.p.dm: 934086a686-4] ",
289-
"dd interior single space submember | 'dd=s:0; t.dm:934086a686-4' | 'dd=s:0' | [:] ",
288+
"dd interior ws between submembers | 'dd=s:0;t.dm:934086a686-4; t.x:y' | 'dd=s:0;t.dm:934086a686-4; t.x:y' | [_dd.p.dm: 934086a686-4] ",
289+
"dd interior single space submember | 'dd=s:0; t.dm:934086a686-4' | 'dd=s:0; t.dm:934086a686-4' | [:] ",
290290
"sampling priority non-numeric dropped | 'dd=s:abc;t.dm:934086a686-4' | 'dd=t.dm:934086a686-4' | [_dd.p.dm: 934086a686-4] ",
291291
"sampling priority overflow dropped | 'dd=s:99999999999;t.dm:934086a686-4' | 'dd=t.dm:934086a686-4' | [_dd.p.dm: 934086a686-4] ",
292292
"sampling priority min int retained | 'dd=s:-2147483648;t.dm:934086a686-4' | 'dd=s:-2147483648;t.dm:934086a686-4' | [_dd.p.dm: 934086a686-4] ",
@@ -296,15 +296,15 @@ static IntStream memberCountArguments() {
296296
"sampling priority ws only value dropped | 'dd=s: ;t.dm:934086a686-4' | 'dd=t.dm:934086a686-4' | [_dd.p.dm: 934086a686-4] ",
297297
"sampling priority just above max int | 'dd=s:2147483648' | | [:] ",
298298
"sampling priority just below min int | 'dd=s:-2147483649' | | [:] ",
299-
"bare element after known unknown | 'dd=x:y;z' | 'dd=x:y' | [:] ",
300-
"bare element before known unknown | 'dd=z;x:y' | 'dd=x:y' | [:] ",
301-
"bare element between known unknowns | 'dd=x:y;z;a:b' | 'dd=x:y;a:b' | [:] ",
299+
"bare element after known unknown | 'dd=x:y;z' | 'dd=x:y;z' | [:] ",
300+
"bare element before known unknown | 'dd=z;x:y' | 'dd=z;x:y' | [:] ",
301+
"bare element between known unknowns | 'dd=x:y;z;a:b' | 'dd=x:y;z;a:b' | [:] ",
302302
"parent id not duplicated as unknown | 'dd=p:b6241412414a;x:y' | 'dd=p:b6241412414a;x:y' | [:] ",
303303
"origin not duplicated as unknown | 'dd=o:rum;x:y' | 'dd=o:rum;x:y' | [:] ",
304304
"sampling priority not duplicated as unknown | 'dd=s:1;x:y' | 'dd=s:1;x:y' | [:] ",
305-
"malformed element with leading space key | 'dd=x:y; z:w' | 'dd=x:y' | [:] ",
306-
"malformed element with interior space key | 'dd=x:y;a b:c' | 'dd=x:y' | [:] ",
307-
"malformed element between known tags | 'dd=s:1; z:w;o:rum' | 'dd=s:1;o:rum' | [:] "
305+
"malformed element with leading space key | 'dd=x:y; z:w' | 'dd=x:y; z:w' | [:] ",
306+
"malformed element with interior space key | 'dd=x:y;a b:c' | 'dd=x:y;a b:c' | [:] ",
307+
"malformed element between known tags | 'dd=s:1; z:w;o:rum' | 'dd=s:1;o:rum; z:w' | [:] "
308308
})
309309
void createPropagationTagsFromHeaderValue(
310310
String headerValue, String expectedHeaderValue, Map<String, String> tags) {

0 commit comments

Comments
 (0)