You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2015/07/24 09:39:31 UTC

[3/3] camel git commit: CAMEL-8996: undertow support query params in producer

CAMEL-8996: undertow support query params in producer


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

Branch: refs/heads/master
Commit: 044c3ad1972ea760786c21c6547624c3903eb4c6
Parents: 47f79a6
Author: Claus Ibsen <da...@apache.org>
Authored: Fri Jul 24 09:44:26 2015 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Fri Jul 24 09:45:58 2015 +0200

----------------------------------------------------------------------
 .../undertow/DefaultUndertowHttpBinding.java    | 14 -----
 .../component/undertow/UndertowHelper.java      | 55 +++++++++++++++++---
 .../component/undertow/UndertowProducer.java    | 19 ++++---
 .../undertow/UndertowProducerTest.java          | 11 ++++
 4 files changed, 72 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/044c3ad1/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java
----------------------------------------------------------------------
diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java
index e19d46d..d5825f4 100644
--- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java
+++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java
@@ -270,20 +270,6 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding {
 
         Object body = message.getBody();
 
-        String method = message.getHeader(Exchange.HTTP_METHOD, String.class);
-
-        if (method == null) {
-            //fallback if method is not defined, check the body
-            if (body == null) {
-                clientRequest.setMethod(Methods.GET);
-            } else {
-                clientRequest.setMethod(Methods.POST);
-            }
-        } else {
-            //method set, use it
-            clientRequest.setMethod(new HttpString(method));
-        }
-
         // set the content type in the response.
         String contentType = MessageHelper.getContentType(message);
         if (contentType != null) {

http://git-wip-us.apache.org/repos/asf/camel/blob/044c3ad1/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowHelper.java
----------------------------------------------------------------------
diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowHelper.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowHelper.java
index 8b55ccc..afbe2a2 100644
--- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowHelper.java
+++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowHelper.java
@@ -22,6 +22,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import io.undertow.util.HttpString;
+import io.undertow.util.Methods;
 import org.apache.camel.Exchange;
 import org.apache.camel.RuntimeExchangeException;
 import org.apache.camel.util.URISupport;
@@ -43,13 +45,7 @@ public final class UndertowHelper {
      * @return the URL to invoke
      */
     public static String createURL(Exchange exchange, UndertowEndpoint endpoint) {
-        String uri = null;
-//        if (!(endpoint.isBridgeEndpoint())) {
-//            uri = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class);
-//        }
-        if (uri == null) {
-            uri = endpoint.getHttpURI().toASCIIString();
-        }
+        String uri = uri = endpoint.getHttpURI().toASCIIString();
 
         // resolve placeholders in uri
         try {
@@ -124,4 +120,49 @@ public final class UndertowHelper {
 
         headers.put(key, value);
     }
+
+    /**
+     * Creates the HttpMethod to use to call the remote server, often either its GET or POST.
+     *
+     * @param exchange the exchange
+     * @return the created method
+     * @throws URISyntaxException
+     */
+    public static HttpString createMethod(Exchange exchange, UndertowEndpoint endpoint, boolean hasPayload) throws URISyntaxException {
+        // is a query string provided in the endpoint URI or in a header (header
+        // overrules endpoint)
+        String queryString = exchange.getIn().getHeader(Exchange.HTTP_QUERY, String.class);
+        // We need also check the HTTP_URI header query part
+        String uriString = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class);
+        // resolve placeholders in uriString
+        try {
+            uriString = exchange.getContext().resolvePropertyPlaceholders(uriString);
+        } catch (Exception e) {
+            throw new RuntimeExchangeException("Cannot resolve property placeholders with uri: " + uriString, exchange, e);
+        }
+        if (uriString != null) {
+            URI uri = new URI(uriString);
+            queryString = uri.getQuery();
+        }
+        if (queryString == null) {
+            queryString = endpoint.getHttpURI().getRawQuery();
+        }
+
+        // compute what method to use either GET or POST
+        HttpString answer;
+        String m = exchange.getIn().getHeader(Exchange.HTTP_METHOD, String.class);
+        if (m != null) {
+            // always use what end-user provides in a header
+            answer = new HttpString(m);
+        } else if (queryString != null) {
+            // if a query string is provided then use GET
+            answer = Methods.GET;
+        } else {
+            // fallback to POST if we have payload, otherwise GET
+            answer = hasPayload ? Methods.POST : Methods.GET;
+        }
+
+        return answer;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/044c3ad1/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java
index 3f39e87..84a8b26 100644
--- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java
+++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java
@@ -26,6 +26,7 @@ import io.undertow.client.ClientExchange;
 import io.undertow.client.ClientRequest;
 import io.undertow.client.UndertowClient;
 import io.undertow.util.Headers;
+import io.undertow.util.HttpString;
 import io.undertow.util.Protocols;
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.Exchange;
@@ -78,19 +79,26 @@ public class UndertowProducer extends DefaultAsyncProducer {
             // get the url from the uri
             url = uri.toASCIIString();
 
+            // what http method to use
+            HttpString method = UndertowHelper.createMethod(exchange, endpoint, exchange.getIn().getBody() != null);
+
             ClientRequest request = new ClientRequest();
             request.setProtocol(Protocols.HTTP_1_1);
             request.setPath(url);
+            request.setMethod(method);
 
             Object body = getRequestBody(request, exchange);
 
             TypeConverter tc = endpoint.getCamelContext().getTypeConverter();
-            ByteBuffer bodyAsByte = tc.convertTo(ByteBuffer.class, body);
+            ByteBuffer bodyAsByte = tc.tryConvertTo(ByteBuffer.class, body);
 
             if (body != null) {
                 request.getRequestHeaders().put(Headers.CONTENT_LENGTH, bodyAsByte.array().length);
             }
 
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Executing http {} method: {}", method, url);
+            }
             connect.get().sendRequest(request, new UndertowProducerCallback(bodyAsByte, exchange, callback));
 
         } catch (Exception e) {
@@ -104,9 +112,7 @@ public class UndertowProducer extends DefaultAsyncProducer {
     }
 
     private Object getRequestBody(ClientRequest request, Exchange camelExchange) {
-        Object result;
-        result = endpoint.getUndertowHttpBinding().toHttpRequest(request, camelExchange.getIn());
-        return result;
+        return endpoint.getUndertowHttpBinding().toHttpRequest(request, camelExchange.getIn());
     }
 
     /**
@@ -124,13 +130,12 @@ public class UndertowProducer extends DefaultAsyncProducer {
             this.callback = callback;
         }
 
-        // TODO: Add some logging of those events at trace or debug level
-
         @Override
         public void completed(ClientExchange clientExchange) {
             clientExchange.setResponseListener(new ClientCallback<ClientExchange>() {
                 @Override
                 public void completed(ClientExchange clientExchange) {
+                    LOG.trace("completed: {}", clientExchange);
                     try {
                         Message message = endpoint.getUndertowHttpBinding().toCamelMessage(clientExchange, camelExchange);
                         if (ExchangeHelper.isOutCapable(camelExchange)) {
@@ -148,6 +153,7 @@ public class UndertowProducer extends DefaultAsyncProducer {
 
                 @Override
                 public void failed(IOException e) {
+                    LOG.trace("failed: {}", e);
                     camelExchange.setException(e);
                     // make sure to call callback
                     callback.done(false);
@@ -168,6 +174,7 @@ public class UndertowProducer extends DefaultAsyncProducer {
 
         @Override
         public void failed(IOException e) {
+            LOG.trace("failed: {}", e);
             camelExchange.setException(e);
             // make sure to call callback
             callback.done(false);

http://git-wip-us.apache.org/repos/asf/camel/blob/044c3ad1/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerTest.java
index ce24653..03059ef 100644
--- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerTest.java
+++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerTest.java
@@ -44,6 +44,17 @@ public class UndertowProducerTest extends BaseUndertowTest {
     }
 
     @Test
+    public void testHttpSimpleWithExchangeHttpQuery() throws Exception {
+        getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_METHOD, "GET");
+        getMockEndpoint("mock:input").expectedHeaderReceived("name", "me");
+
+        String out = template.requestBodyAndHeader("undertow:http://localhost:{{port}}/foo", null, Exchange.HTTP_QUERY, "name=me", String.class);
+        assertEquals("Bye World", out);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
     public void testHttpSimpleHeader() throws Exception {
         getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_METHOD, "POST");