File tree Expand file tree Collapse file tree 2 files changed +24
-3
lines changed
dd-java-agent/instrumentation/java/java-net/java-net-11.0/src
main/java11/datadog/trace/instrumentation/httpclient
test/groovy/datadog/trace/instrumentation/httpclient Expand file tree Collapse file tree 2 files changed +24
-3
lines changed Original file line number Diff line number Diff line change 44import static datadog .trace .instrumentation .httpclient .HttpHeadersInjectAdapter .KEEP ;
55import static datadog .trace .instrumentation .httpclient .HttpHeadersInjectAdapter .SETTER ;
66import static datadog .trace .instrumentation .httpclient .JavaNetClientDecorator .DECORATE ;
7+ import static java .lang .String .CASE_INSENSITIVE_ORDER ;
78
89import java .net .http .HttpHeaders ;
9- import java .util .HashMap ;
1010import java .util .List ;
1111import java .util .Map ;
12+ import java .util .TreeMap ;
1213import net .bytebuddy .asm .Advice ;
1314
1415public class HeadersAdvice {
1516 @ Advice .OnMethodExit (onThrowable = Throwable .class , suppress = Throwable .class )
1617 public static void methodExit (@ Advice .Return (readOnly = false ) HttpHeaders headers ) {
17- final Map <String , List <String >> headerMap = new HashMap <>(headers .map ());
18+ // Note: adding duplicate keys will throw an IllegalArgumentException so we need to dedupe
19+ // case insensitively
20+ final Map <String , List <String >> headerMap = new TreeMap <>(CASE_INSENSITIVE_ORDER );
21+ headerMap .putAll (headers .map ());
1822 DECORATE .injectContext (getCurrentContext (), headerMap , SETTER );
1923 headers = HttpHeaders .of (headerMap , KEEP );
2024 }
Original file line number Diff line number Diff line change 11package datadog.trace.instrumentation.httpclient
22
3- import datadog.trace.agent.test.base.HttpClientTest
3+
44import static datadog.trace.instrumentation.httpclient.JavaNetClientDecorator.DECORATE
55
6+ import datadog.trace.agent.test.base.HttpClientTest
67import java.net.http.HttpClient
78import java.net.http.HttpRequest
89import java.net.http.HttpResponse
@@ -42,6 +43,22 @@ abstract class JavaHttpClientTest extends HttpClientTest {
4243 boolean testRedirects () {
4344 false
4445 }
46+
47+ def ' should not inject duplicate headers' () {
48+ when :
49+ def status = doRequest(" GET" , server. address. resolve(" /success" ),
50+ // our codec inject names all lowercase
51+ [" X-Datadog-Trace-ID" : " 0" ])
52+
53+ then :
54+ status == 200
55+ assertTraces(2 ) {
56+ trace(size(1 )) {
57+ clientSpan(it, null )
58+ }
59+ server. distributedRequestTrace(it, trace(0 ). last())
60+ }
61+ }
4562}
4663
4764class JavaHttpClientV0Test extends JavaHttpClientTest {
You can’t perform that action at this time.
0 commit comments