1+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.BODY_MULTIPART
2+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.BODY_URLENCODED
3+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.CREATED
4+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.CREATED_IS
5+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.ERROR
6+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.EXCEPTION
7+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.FORWARDED
8+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.LOGIN
9+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.NOT_FOUND
10+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.NOT_HERE
11+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.PATH_PARAM
12+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.QUERY_ENCODED_BOTH
13+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.QUERY_ENCODED_QUERY
14+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.QUERY_PARAM
15+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.REDIRECT
16+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.SUCCESS
17+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.TIMEOUT
18+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.TIMEOUT_ERROR
19+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.USER_BLOCK
20+ import static datadog.trace.agent.test.base.HttpServerTest.controller
21+
122import datadog.trace.agent.test.asserts.TraceAssert
223import datadog.trace.agent.test.base.HttpServer
324import datadog.trace.agent.test.base.HttpServerTest
@@ -14,8 +35,8 @@ import io.undertow.servlet.api.InstanceHandle
1435import io.undertow.servlet.api.ServletContainer
1536import io.undertow.servlet.api.ServletInfo
1637import io.undertow.servlet.util.ImmediateInstanceHandle
17- import org.slf4j.LoggerFactory
18-
38+ import java.nio.charset.StandardCharsets
39+ import java.util.concurrent.atomic.AtomicReference
1940import javax.servlet.AsyncContext
2041import javax.servlet.AsyncEvent
2142import javax.servlet.AsyncListener
@@ -26,29 +47,7 @@ import javax.servlet.WriteListener
2647import javax.servlet.http.HttpServlet
2748import javax.servlet.http.HttpServletRequest
2849import javax.servlet.http.HttpServletResponse
29- import java.nio.charset.StandardCharsets
30- import java.util.concurrent.atomic.AtomicReference
31-
32- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.BODY_MULTIPART
33- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.BODY_URLENCODED
34- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.CREATED
35- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.CREATED_IS
36- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.ERROR
37- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.EXCEPTION
38- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.FORWARDED
39- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.LOGIN
40- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.NOT_FOUND
41- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.NOT_HERE
42- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.PATH_PARAM
43- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.QUERY_ENCODED_BOTH
44- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.QUERY_ENCODED_QUERY
45- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.QUERY_PARAM
46- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.REDIRECT
47- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.SUCCESS
48- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.TIMEOUT
49- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.TIMEOUT_ERROR
50- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.USER_BLOCK
51- import static datadog.trace.agent.test.base.HttpServerTest.controller
50+ import org.slf4j.LoggerFactory
5251
5352class UndertowServletAsyncTest extends HttpServerTest<Undertow > {
5453 private static final CONTEXT = " ctx"
@@ -119,9 +118,10 @@ class UndertowServletAsyncTest extends HttpServerTest<Undertow> {
119118 dispatch = false
120119 req. setAttribute(' ddog.dispatched' , 1 )
121120 if (req. servletPath. contains(' ' )) {
122- // bug in undertow when dispatching from /foo%20bar
123- // (matches mapping "/foo bar" 1st and "/foo%20bar" after dispatch)
124- asyncContext. dispatch(req. servletPath)
121+ // Older versions match the decoded servlet path on redispatch,
122+ // while the newer RequestParser expects the raw encoded path;
123+ // using the other form either misses the servlet mapping or hangs.
124+ asyncContext. dispatch(hasNewRequestParser() ? ep. rawPath : req. servletPath)
125125 } else {
126126 asyncContext. dispatch()
127127 }
@@ -260,6 +260,16 @@ class UndertowServletAsyncTest extends HttpServerTest<Undertow> {
260260 operation()
261261 }
262262
263+ private static boolean hasNewRequestParser () {
264+ // returns true for versions that include the bugfix pushed in https://github.com/undertow-io/undertow/pull/1949
265+ try {
266+ Class . forName(' io.undertow.server.protocol.http.RequestParser' )
267+ return true
268+ } catch (ClassNotFoundException ignored) {
269+ return false
270+ }
271+ }
272+
263273 @Override
264274 boolean testTimeout () {
265275 true
@@ -408,7 +418,8 @@ class UndertowServletAsyncTest extends HttpServerTest<Undertow> {
408418 trace. span {
409419 serviceName expectedServiceName()
410420 operationName ' servlet.dispatch'
411- String resName = endpoint. path == endpoint. rawPath ? ' servlet.dispatch' : endpoint. path
421+ String resName =
422+ endpoint. path == endpoint. rawPath ? ' servlet.dispatch' : hasNewRequestParser() ? endpoint. rawPath : endpoint. path
412423 resourceName resName
413424 errored(endpoint. throwsException || endpoint == TIMEOUT_ERROR )
414425 childOfPrevious()
0 commit comments