Browse Source

Fix request header capture corrupting tomcat request (#11469)

Lauri Tulmin 9 months ago
parent
commit
300ad5ebb3

+ 13 - 1
instrumentation/tomcat/tomcat-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/common/TomcatHttpAttributesGetter.java

@@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.tomcat.common;
 import static io.opentelemetry.javaagent.instrumentation.tomcat.common.TomcatHelper.messageBytesToString;
 
 import io.opentelemetry.instrumentation.api.semconv.http.HttpServerAttributesGetter;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import javax.annotation.Nullable;
@@ -15,6 +16,7 @@ import org.apache.coyote.ActionCode;
 import org.apache.coyote.Request;
 import org.apache.coyote.Response;
 import org.apache.tomcat.util.buf.MessageBytes;
+import org.apache.tomcat.util.http.MimeHeaders;
 
 public class TomcatHttpAttributesGetter implements HttpServerAttributesGetter<Request, Response> {
 
@@ -44,7 +46,17 @@ public class TomcatHttpAttributesGetter implements HttpServerAttributesGetter<Re
 
   @Override
   public List<String> getHttpRequestHeader(Request request, String name) {
-    return Collections.list(request.getMimeHeaders().values(name));
+    List<String> result = null;
+    MimeHeaders headers = request.getMimeHeaders();
+    int i = headers.findHeader(name, 0);
+    while (i != -1) {
+      if (result == null) {
+        result = new ArrayList<>();
+      }
+      result.add(messageBytesToString(headers.getValue(i)));
+      i = headers.findHeader(name, i + 1);
+    }
+    return result != null ? result : Collections.emptyList();
   }
 
   @Override