This is an automated email from the ASF dual-hosted git repository. ffang pushed a commit to branch camel-3.4.x in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-3.4.x by this push: new 5708df5 [CAMEL-15370] CxfRsProducer: All but last value of query parameter with multiple values are lost (#4076) 5708df5 is described below commit 5708df50869bc701c58bea2e848f0933e40a9abd Author: denninger-eu <59598722+denninger...@users.noreply.github.com> AuthorDate: Fri Aug 7 14:58:08 2020 +0200 [CAMEL-15370] CxfRsProducer: All but last value of query parameter with multiple values are lost (#4076) * [CAMEL-15370] CxfRsProducer: All but last value of query parameter with Multiple Values are lost * [CAMEL-15370] CxfRsProducer: All but last value of query parameter with multiple values are lost * fixed tabs/spaces * tabs/spaces Co-authored-by: k5 <m...@k-5.de> (cherry picked from commit c3cab1e87640ffe35e02ca510aa86b08f5461021) --- .../camel/component/cxf/jaxrs/CxfRsProducer.java | 28 +++++++-------- .../component/cxf/jaxrs/CxfRsProducerTest.java | 42 +++++++++++++++++++++- 2 files changed, 55 insertions(+), 15 deletions(-) diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java index 4c4d227..6467f7b 100644 --- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java +++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducer.java @@ -237,25 +237,27 @@ public class CxfRsProducer extends DefaultAsyncProducer { CxfRsEndpoint cxfRsEndpoint = (CxfRsEndpoint) getEndpoint(); // check if there is a query map in the message header Map<String, String> maps = inMessage.getHeader(CxfConstants.CAMEL_CXF_RS_QUERY_MAP, Map.class); - if (maps == null) { - // Get the map from HTTP_QUERY header + if (maps != null) { + insertQueryParametersFromMap(client, maps); + } else { String queryString = inMessage.getHeader(Exchange.HTTP_QUERY, String.class); if (queryString != null) { - maps = getQueryParametersFromQueryString(queryString, - ExchangeHelper.getCharsetName(exchange)); + // Insert QueryParameters from HTTP_QUERY header + insertQueryParametersFromQueryString(client, queryString, ExchangeHelper.getCharsetName(exchange)); + } else { + insertQueryParametersFromMap(client, cxfRsEndpoint.getParameters()); } } - if (maps == null) { - maps = cxfRsEndpoint.getParameters(); - } + + setupClientHeaders(client, exchange); + } + + private void insertQueryParametersFromMap(WebClient client, Map<String, String> maps) { if (maps != null) { for (Map.Entry<String, String> entry : maps.entrySet()) { client.query(entry.getKey(), entry.getValue()); } } - - setupClientHeaders(client, exchange); - } protected void setupClientMatrix(WebClient client, Exchange exchange) throws Exception { @@ -482,19 +484,17 @@ public class CxfRsProducer extends DefaultAsyncProducer { return clientFactoryBeanCache; } - private Map<String, String> getQueryParametersFromQueryString(String queryString, String charset) throws UnsupportedEncodingException { - Map<String, String> answer = new LinkedHashMap<>(); + private void insertQueryParametersFromQueryString(WebClient client, String queryString, String charset) throws UnsupportedEncodingException { for (String param : queryString.split("&")) { String[] pair = param.split("=", 2); if (pair.length == 2) { String name = URLDecoder.decode(pair[0], charset); String value = URLDecoder.decode(pair[1], charset); - answer.put(name, value); + client.query(name, value); } else { throw new IllegalArgumentException("Invalid parameter, expected to be a pair but was " + param); } } - return answer; } private Method findRightMethod(List<Class<?>> resourceClasses, String methodName, diff --git a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerTest.java b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerTest.java index 3818f6d..16e8042 100644 --- a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerTest.java +++ b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/jaxrs/CxfRsProducerTest.java @@ -410,7 +410,47 @@ public class CxfRsProducerTest extends CamelSpringTestSupport { assertEquals("q1=new&q2=world", response, "The response value is wrong"); } - + @Test + public void testProducerWithQueryParametersMultipleValues() { + Exchange exchange = template.send("cxfrs://http://localhost:" + getPort2() + "/" + getClass().getSimpleName() + "/testQuery?httpClientAPI=true&synchronous=true", new Processor() { + public void process(Exchange exchange) throws Exception { + exchange.setPattern(ExchangePattern.InOut); + Message inMessage = exchange.getIn(); + // set the Http method + inMessage.setHeader(Exchange.HTTP_METHOD, "GET"); + inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS, InputStream.class); + inMessage.setHeader(Exchange.HTTP_QUERY, "id=1&id=2"); + inMessage.setBody(null); + } + + }); + + // get the response message + String response = exchange.getOut().getBody(String.class); + assertNotNull(response, "The response should not be null"); + assertEquals("id=1&id=2", response, "The response value is wrong"); + } + + @Test + public void testProducerWithQueryParametersEscapeAmpersand() { + Exchange exchange = template.send("cxfrs://http://localhost:" + getPort2() + "/" + getClass().getSimpleName() + "/testQuery?httpClientAPI=true&synchronous=true", new Processor() { + public void process(Exchange exchange) throws Exception { + exchange.setPattern(ExchangePattern.InOut); + Message inMessage = exchange.getIn(); + // set the Http method + inMessage.setHeader(Exchange.HTTP_METHOD, "GET"); + inMessage.setHeader(CxfConstants.CAMEL_CXF_RS_RESPONSE_CLASS, InputStream.class); + inMessage.setHeader(Exchange.HTTP_QUERY, "id=1%262"); + inMessage.setBody(null); + } + + }); + + // get the response message + String response = exchange.getOut().getBody(String.class); + assertNotNull(response, "The response should not be null"); + assertEquals("id=1%262", response, "The response value is wrong"); + } @Test public void testRestServerDirectlyGetCustomer() {