Details
-
Type:
Bug
-
Status: Closed
-
Priority:
Major
-
Resolution: Fixed
-
Affects Version/s: 3.1.7
-
Component/s: JAX-RS, Transports
-
Labels:None
-
Estimated Complexity:Unknown
Description
Suppose a JAX-RS endpoint like below uses CXF Continuations API to handle requests asynchronously:
@Path("/greeting") public class GreetingService { @GET @Path("/hello/{name}") public String hello(@PathParam("name") String name) {
When this endpoint is invoked with an URL containing encoded characters (e.g. "%20"):
http://localhost:9000/greeting/hello/A%20B%20C
it fails to handle it and throws the following exception:
java.lang.IllegalArgumentException: Illegal character in path at index 38: http://localhost:9000/greeting/hello/A B C at java.net.URI.create(URI.java:852) at org.apache.cxf.transport.servlet.BaseUrlHelper.getBaseURL(BaseUrlHelper.java:48) at org.apache.cxf.transport.servlet.ServletController.getBaseURL(ServletController.java:74) at org.apache.cxf.transport.servlet.ServletController.updateDestination(ServletController.java:83) at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:207) at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160) at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:180) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:299) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:223) at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:274) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:517) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) at org.eclipse.jetty.server.Server.handleAsync(Server.java:549) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:318) at org.eclipse.jetty.server.HttpChannel.run(HttpChannel.java:262) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) at java.lang.Thread.run(Thread.java:745) Caused by: java.net.URISyntaxException: Illegal character in path at index 38: http://localhost:9000/greeting/hello/A B C at java.net.URI$Parser.fail(URI.java:2848) at java.net.URI$Parser.checkChars(URI.java:3021) at java.net.URI$Parser.parseHierarchical(URI.java:3105) at java.net.URI$Parser.parse(URI.java:3053) at java.net.URI.<init>(URI.java:588) at java.net.URI.create(URI.java:850) ... 21 more
Note this issue happens only when the endpoint is used with Servlet Transport. It doesn't happen when it's used with Jetty HTTP Transport.