You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Colm O hEigeartaigh (Jira)" <ji...@apache.org> on 2021/05/31 07:21:00 UTC

[jira] [Commented] (CXF-8387) Allow special characters to be used for a queryParam name.

    [ https://issues.apache.org/jira/browse/CXF-8387?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17354254#comment-17354254 ] 

Colm O hEigeartaigh commented on CXF-8387:
------------------------------------------

[~reta] There is an open PR - can you review to see if it should be included for the next release? https://github.com/apache/cxf/pull/776

> Allow special characters to be used for a queryParam name.
> ----------------------------------------------------------
>
>                 Key: CXF-8387
>                 URL: https://issues.apache.org/jira/browse/CXF-8387
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-RS
>    Affects Versions: 3.3.7
>         Environment: {code:java}
> // Some comments here
> public String getFoo()
> {
>     return foo;
> }
> {code}
>            Reporter: John Koehler
>            Assignee: Andriy Redko
>            Priority: Minor
>
> Customer would like to use ("/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%1A!$'()*+,;:@", "apiKeyQueryParam1Value" ) as a queryParam. The get fails with a javax.ws.rs.core.UriBuilderException: URI can not be built.
> {code:java}
>         Response response = client.target("http://localhost:" + "8010" + "/paramconverter/")
>                         .path("application/resource/queryParamSpecialCharacters")
>                         .queryParam("/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%1A!$'()*+,;:@", "apiKeyQueryParam1Value")
>                         .request(MediaType.APPLICATION_JSON_TYPE)
>                         .get();
> {code}
> {code:java}
>     @GET
>     @Path("queryParamSpecialCharacters")
>     public Response queryParamSpecialCharacters(@QueryParam("/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%1A!$'()*+,;:@") final String queryParm1) {
>         System.out.println("queryParamSpecialCharacters queryParm1 = " + queryParm1);
>         return Response.ok(queryParm1).build();
>     }
> {code}
> {code:java}
> [12/8/20, 8:54:22:004 CST] 00000076 SystemErr                                                    R javax.ws.rs.core.UriBuilderException: URI can not be built
> 	at org.apache.cxf.jaxrs.impl.UriBuilderImpl.doBuild(UriBuilderImpl.java:120)
> 	at org.apache.cxf.jaxrs.impl.UriBuilderImpl.buildFromEncoded(UriBuilderImpl.java:245)
> 	at org.apache.cxf.jaxrs.client.AbstractClient.getCurrentURI(AbstractClient.java:319)
> 	at org.apache.cxf.jaxrs.client.WebClient.fromClient(WebClient.java:315)
> 	at org.apache.cxf.jaxrs.client.WebClient.fromClient(WebClient.java:295)
> 	at org.apache.cxf.jaxrs.client.spec.ClientImpl$WebTargetImpl.request(ClientImpl.java:373)
> 	at org.apache.cxf.jaxrs.client.spec.ClientImpl$WebTargetImpl.request(ClientImpl.java:438)
> 	at com.ibm.ws.jaxrs.fat.paramconverter.ClientTestServlet.testQueryParamSpecialCharacters(ClientTestServlet.java:256)
> 	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> 	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
> 	at componenttest.app.FATServlet.doGet(FATServlet.java:71)
> 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:686)
> 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:791)
> 	at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1257)
> 	at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:745)
> 	at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:442)
> 	at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1226)
> 	at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:5057)
> 	at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.handleRequest(DynamicVirtualHost.java:314)
> 	at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:1005)
> 	at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.run(DynamicVirtualHost.java:279)
> 	at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink$TaskWrapper.run(HttpDispatcherLink.java:1141)
> 	at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink.wrapHandlerAndExecute(HttpDispatcherLink.java:422)
> 	at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink.ready(HttpDispatcherLink.java:381)
> 	at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:565)
> 	at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.handleNewRequest(HttpInboundLink.java:499)
> 	at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.processRequest(HttpInboundLink.java:359)
> 	at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.ready(HttpInboundLink.java:326)
> 	at com.ibm.ws.tcpchannel.internal.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:167)
> 	at com.ibm.ws.tcpchannel.internal.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:75)
> 	at com.ibm.ws.tcpchannel.internal.WorkQueueManager.requestComplete(WorkQueueManager.java:504)
> 	at com.ibm.ws.tcpchannel.internal.WorkQueueManager.attemptIO(WorkQueueManager.java:574)
> 	at com.ibm.ws.tcpchannel.internal.WorkQueueManager.workerRun(WorkQueueManager.java:958)
> 	at com.ibm.ws.tcpchannel.internal.WorkQueueManager$Worker.run(WorkQueueManager.java:1047)
> 	at com.ibm.ws.threading.internal.ExecutorServiceImpl$RunnableWrapper.run(ExecutorServiceImpl.java:239)
> 	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
> 	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
> 	at java.base/java.lang.Thread.run(Thread.java:831)
> Caused by: java.net.URISyntaxException: Illegal character in query at index 154: http://localhost:8010/paramconverter/application/resource/queryParamSpecialCharacters?/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~�!$'()* ,;:@=apiKeyQueryParam1Value
> 	at java.base/java.net.URI$Parser.fail(URI.java:2915)
> 	at java.base/java.net.URI$Parser.checkChars(URI.java:3086)
> 	at java.base/java.net.URI$Parser.parseHierarchical(URI.java:3174)
> 	at java.base/java.net.URI$Parser.parse(URI.java:3116)
> 	at java.base/java.net.URI.<init>(URI.java:600)
> 	at org.apache.cxf.jaxrs.impl.UriBuilderImpl.buildURIFromEncoded(UriBuilderImpl.java:202)
> 	at org.apache.cxf.jaxrs.impl.UriBuilderImpl.buildURI(UriBuilderImpl.java:175)
> 	at org.apache.cxf.jaxrs.impl.UriBuilderImpl.doBuild(UriBuilderImpl.java:118)
> 	... 39 more
> {code}
> I tried the suggested workaround to encode the queryParam name twice.  
> {code:java}
>         Response response = client.target(URI_CONTEXT_ROOT)
>                         .path("application/resource/queryParamSpecialCharacters")
>                         .queryParam(URLEncoder.encode(URLEncoder.encode("/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%1A!$'()*+,;:@", "UTF-8"), "UTF-8"), "apiKeyQueryParam1Value")
>                         .request(MediaType.APPLICATION_JSON_TYPE)
>                         .get();
> {code}
> {code:java}
>     @GET
>     @Path("queryParamSpecialCharacters")
>     public Response queryParamSpecialCharacters(@QueryParam("/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~%1A!$'()*+,;:@") String queryParm1) {
>         System.out.println("queryParamSpecialCharacters queryParm1 = " + queryParm1);
>         return Response.ok(queryParm1).build();
>     }
> {code}
> I no longer get the error *javax.ws.rs.core.UriBuilderException: URI can not be built.* .  Unfortunately the test fails in a different way.  The queryParam value is set to null.  
> {code:java}
> SystemOut                                                    O queryParamSpecialCharacters queryParm1 = null
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)