Uploaded image for project: 'CXF'
  1. CXF
  2. CXF-7043

JAX-RS endpoints cannot handle encoded URL when used with continuation and servlet transport

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 3.1.7
    • Fix Version/s: 3.1.8, 3.0.11, 3.2.0
    • 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.

        Attachments

          Activity

            People

            • Assignee:
              sergey_beryozkin Sergey Beryozkin
              Reporter:
              tadayosi Tadayoshi Sato
            • Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: