You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by zr...@apache.org on 2017/04/06 13:03:28 UTC

camel git commit: CAMEL-11116 Better handling of query parameters...

Repository: camel
Updated Branches:
  refs/heads/master 6a97606f0 -> 0bba43e55


CAMEL-11116 Better handling of query parameters...

... in RestProducer

This changes the way `queryParameters` producer endpoint parameter is
determined, now component/endpoint parameters are not a part of the
query string making sure that any query parameters explicitly set via
`queryParameters` endpoint property are combined.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/0bba43e5
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/0bba43e5
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/0bba43e5

Branch: refs/heads/master
Commit: 0bba43e55023d5a2498175bc59949505f983a156
Parents: 6a97606
Author: Zoran Regvart <zr...@apache.org>
Authored: Thu Apr 6 15:02:55 2017 +0200
Committer: Zoran Regvart <zr...@apache.org>
Committed: Thu Apr 6 15:03:12 2017 +0200

----------------------------------------------------------------------
 .../camel/component/rest/RestComponent.java     | 17 ++++--
 .../camel/component/rest/RestEndpointTest.java  | 55 ++++++++++++++++----
 2 files changed, 59 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/0bba43e5/camel-core/src/main/java/org/apache/camel/component/rest/RestComponent.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/rest/RestComponent.java b/camel-core/src/main/java/org/apache/camel/component/rest/RestComponent.java
index deee394..567d315 100644
--- a/camel-core/src/main/java/org/apache/camel/component/rest/RestComponent.java
+++ b/camel-core/src/main/java/org/apache/camel/component/rest/RestComponent.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.rest;
 
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
@@ -32,6 +33,8 @@ import org.apache.camel.util.CamelContextHelper;
 import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.IntrospectionSupport;
 import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.StringHelper;
+import org.apache.camel.util.URISupport;
 
 /**
  * Rest component.
@@ -73,12 +76,18 @@ public class RestComponent extends DefaultComponent {
         }
         answer.setHost(h);
 
-        String query = ObjectHelper.after(uri, "?");
-        if (query != null) {
-            answer.setQueryParameters(query);
+        setProperties(answer, parameters);
+        if (!parameters.isEmpty()) {
+            // use only what remains and at this point parameters that have been used have been removed
+            // without overwriting any query parameters set via queryParameters endpoint option
+            final Map<String, Object> queryParameters = new LinkedHashMap<>(parameters);
+            final Map<String, Object> existingQueryParameters = URISupport.parseQuery(answer.getQueryParameters());
+            queryParameters.putAll(existingQueryParameters);
+
+            final String remainingParameters = URISupport.createQueryString(queryParameters);
+            answer.setQueryParameters(remainingParameters);
         }
 
-        setProperties(answer, parameters);
         answer.setParameters(parameters);
 
         if (!remaining.contains(":")) {

http://git-wip-us.apache.org/repos/asf/camel/blob/0bba43e5/camel-core/src/test/java/org/apache/camel/component/rest/RestEndpointTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/component/rest/RestEndpointTest.java b/camel-core/src/test/java/org/apache/camel/component/rest/RestEndpointTest.java
index 7cebed0..a889811 100644
--- a/camel-core/src/test/java/org/apache/camel/component/rest/RestEndpointTest.java
+++ b/camel-core/src/test/java/org/apache/camel/component/rest/RestEndpointTest.java
@@ -29,31 +29,39 @@ import org.apache.camel.spi.RestProducerFactory;
 import org.junit.Assert;
 import org.junit.Test;
 
+import static org.junit.Assert.assertEquals;
+
 public class RestEndpointTest {
 
     public static class MockRest extends DefaultComponent implements RestProducerFactory {
         @Override
-        public Producer createProducer(CamelContext camelContext, String host, String verb, String basePath,
-            String uriTemplate, String queryParameters, String consumes, String produces,
-            Map<String, Object> parameters) throws Exception {
+        public Producer createProducer(final CamelContext camelContext, final String host, final String verb,
+            final String basePath, final String uriTemplate, final String queryParameters, final String consumes,
+            final String produces, final Map<String, Object> parameters) throws Exception {
             return null;
         }
 
         @Override
-        protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters)
-            throws Exception {
+        protected Endpoint createEndpoint(final String uri, final String remaining,
+            final Map<String, Object> parameters) throws Exception {
             return null;
         }
     }
 
-    @Test
-    public void shouldConfigureBindingMode() throws Exception {
-        final CamelContext context = new DefaultCamelContext();
+    RestComponent restComponent;
+
+    CamelContext context;
+
+    public RestEndpointTest() {
+        context = new DefaultCamelContext();
         context.addComponent("mock-rest", new MockRest());
 
-        final RestComponent restComponent = new RestComponent();
+        restComponent = new RestComponent();
         restComponent.setCamelContext(context);
+    }
 
+    @Test
+    public void shouldConfigureBindingMode() throws Exception {
         final RestEndpoint restEndpoint = new RestEndpoint("rest:GET:/path", restComponent);
         restEndpoint.setComponentName("mock-rest");
         restEndpoint.setParameters(new HashMap<>());
@@ -64,4 +72,33 @@ public class RestEndpointTest {
 
         Assert.assertEquals(producer.getBindingMode(), RestBindingMode.json);
     }
+
+    @Test
+    public void shouldCreateQueryParametersFromUnusedEndpointParameters() throws Exception {
+        final Map<String, Object> parameters = new HashMap<>();
+        parameters.put("host", "http://localhost");
+        parameters.put("bindingMode", "json");
+        parameters.put("foo", "bar");
+
+        final RestEndpoint endpoint = (RestEndpoint) restComponent
+            .createEndpoint("rest:GET:/path?host=http://localhost&bindingMode=json&foo=bar", "GET:/path", parameters);
+
+        assertEquals("http://localhost", endpoint.getHost());
+        assertEquals(RestBindingMode.json, endpoint.getBindingMode());
+        assertEquals("GET", endpoint.getMethod());
+        assertEquals("/path", endpoint.getPath());
+        assertEquals("foo=bar", endpoint.getQueryParameters());
+    }
+
+    @Test
+    public void shouldSupportQueryParametersSetViaEndpointUri() throws Exception {
+        RestEndpoint endpoint = (RestEndpoint) context.getComponent("rest").createEndpoint(
+            "rest:GET:/path?host=http://localhost&bindingMode=json&foo=bar&queryParameters=RAW(a%3Db%26c%3Dd)");
+
+        assertEquals("http://localhost", endpoint.getHost());
+        assertEquals(RestBindingMode.json, endpoint.getBindingMode());
+        assertEquals("GET", endpoint.getMethod());
+        assertEquals("/path", endpoint.getPath());
+        assertEquals("foo=bar&a=b&c=d", endpoint.getQueryParameters());
+    }
 }