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:29 UTC

[1/3] camel git commit: CAMEL-8996: Polished camel-undertow a bit

Repository: camel
Updated Branches:
  refs/heads/master 87e3249f2 -> 044c3ad19


CAMEL-8996: Polished camel-undertow a bit


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

Branch: refs/heads/master
Commit: cdd64e10a6c761ccfba4b6d605c53df1250bb9eb
Parents: 87e3249
Author: Claus Ibsen <da...@apache.org>
Authored: Fri Jul 24 09:07:55 2015 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Fri Jul 24 09:07:55 2015 +0200

----------------------------------------------------------------------
 .../component/undertow/UndertowComponent.java   | 44 ++------------------
 .../component/undertow/UndertowEndpoint.java    | 24 ++++++++---
 .../component/undertow/UndertowHeaderTest.java  | 21 ++++++++--
 .../undertow/UndertowProducerTest.java          |  4 --
 .../src/test/resources/SpringTest.xml           |  2 +-
 5 files changed, 42 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/cdd64e10/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowComponent.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowComponent.java
index e1ffb30..d037eae 100644
--- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowComponent.java
+++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowComponent.java
@@ -19,7 +19,6 @@ package org.apache.camel.component.undertow;
 import java.net.URI;
 import java.util.HashMap;
 import java.util.Map;
-import javax.net.ssl.SSLContext;
 
 import io.undertow.Handlers;
 import io.undertow.Undertow;
@@ -31,13 +30,11 @@ import org.apache.camel.Processor;
 import org.apache.camel.component.undertow.handlers.HttpCamelHandler;
 import org.apache.camel.component.undertow.handlers.NotFoundHandler;
 import org.apache.camel.impl.UriEndpointComponent;
-import org.apache.camel.spi.HeaderFilterStrategy;
 import org.apache.camel.spi.RestConfiguration;
 import org.apache.camel.spi.RestConsumerFactory;
 import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.URISupport;
 import org.apache.camel.util.UnsafeUriCharactersEncoder;
-import org.apache.camel.util.jsse.SSLContextParameters;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,55 +44,21 @@ import org.slf4j.LoggerFactory;
 public class UndertowComponent extends UriEndpointComponent implements RestConsumerFactory {
     private static final Logger LOG = LoggerFactory.getLogger(UndertowEndpoint.class);
 
-    private UndertowHttpBinding undertowHttpBinding;
-    private Map<Integer, UndertowRegistry> serversRegistry = new HashMap<Integer, UndertowRegistry>();
+    private UndertowHttpBinding undertowHttpBinding = new DefaultUndertowHttpBinding();
+    private final Map<Integer, UndertowRegistry> serversRegistry = new HashMap<Integer, UndertowRegistry>();
 
     public UndertowComponent() {
         super(UndertowEndpoint.class);
-        this.undertowHttpBinding = new DefaultUndertowHttpBinding();
     }
 
     @Override
     protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
-        //extract parameters from URI
-        Boolean matchOnUriPrefix = getAndRemoveParameter(parameters, "matchOnUriPrefix", Boolean.class);
-        HeaderFilterStrategy headerFilterStrategy = resolveAndRemoveReferenceParameter(parameters, "headerFilterStrategy", HeaderFilterStrategy.class);
-        SSLContextParameters sslContextParameters = resolveAndRemoveReferenceParameter(parameters, "sslContextParametersRef", SSLContextParameters.class);
-        Boolean throwExceptionOnFailure = getAndRemoveParameter(parameters, "throwExceptionOnFailure", Boolean.class);
-        Boolean transferException = getAndRemoveParameter(parameters, "transferException", Boolean.class);
-        String httpMethodRestrict = getAndRemoveParameter(parameters, "httpMethodRestrict", String.class);
-
         String address = remaining;
         URI httpUri = new URI(UnsafeUriCharactersEncoder.encodeHttpURI(address));
         URI endpointUri = URISupport.createRemainingURI(httpUri, parameters);
 
         UndertowEndpoint endpoint = new UndertowEndpoint(endpointUri.toString(), this, httpUri);
-
-        if (endpoint.getUndertowHttpBinding() == null) {
-            endpoint.setUndertowHttpBinding(undertowHttpBinding);
-        }
-
-        //set parameters if they exists in URI
-        if (httpMethodRestrict != null) {
-            endpoint.setHttpMethodRestrict(httpMethodRestrict);
-        }
-        if (matchOnUriPrefix != null) {
-            endpoint.setMatchOnUriPrefix(matchOnUriPrefix);
-        }
-        if (headerFilterStrategy != null) {
-            endpoint.setHeaderFilterStrategy(headerFilterStrategy);
-        }
-        if (sslContextParameters != null) {
-            SSLContext sslContext = sslContextParameters.createSSLContext();
-            endpoint.setSslContext(sslContext);
-        }
-        if (throwExceptionOnFailure != null) {
-            endpoint.setThrowExceptionOnFailure(throwExceptionOnFailure);
-        }
-        if (transferException != null) {
-            endpoint.setTransferException(transferException);
-        }
-
+        endpoint.setUndertowHttpBinding(undertowHttpBinding);
         setProperties(endpoint, parameters);
         return endpoint;
     }
@@ -162,6 +125,7 @@ public class UndertowComponent extends UriEndpointComponent implements RestConsu
     @Override
     protected void doStop() throws Exception {
         super.doStop();
+        serversRegistry.clear();
     }
 
     protected Undertow rebuildServer(UndertowRegistry registy) {

http://git-wip-us.apache.org/repos/asf/camel/blob/cdd64e10/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowEndpoint.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowEndpoint.java
index c1b5d54..1c25225 100644
--- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowEndpoint.java
+++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowEndpoint.java
@@ -33,6 +33,7 @@ import org.apache.camel.spi.HeaderFilterStrategyAware;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
+import org.apache.camel.util.jsse.SSLContextParameters;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -45,6 +46,7 @@ public class UndertowEndpoint extends DefaultEndpoint implements HeaderFilterStr
     private static final Logger LOG = LoggerFactory.getLogger(UndertowEndpoint.class);
 
     private UndertowComponent component;
+    private SSLContext sslContext;
 
     @UriPath
     private URI httpURI;
@@ -53,7 +55,7 @@ public class UndertowEndpoint extends DefaultEndpoint implements HeaderFilterStr
     @UriParam
     private HeaderFilterStrategy headerFilterStrategy;
     @UriParam
-    private SSLContext sslContext;
+    private SSLContextParameters sslContextParameters;
     @UriParam(label = "consumer")
     private String httpMethodRestrict;
     @UriParam(label = "consumer", defaultValue = "true")
@@ -107,6 +109,10 @@ public class UndertowEndpoint extends DefaultEndpoint implements HeaderFilterStr
         return exchange;
     }
 
+    public SSLContext getSslContext() {
+        return sslContext;
+    }
+
     public URI getHttpURI() {
         return httpURI;
     }
@@ -152,15 +158,15 @@ public class UndertowEndpoint extends DefaultEndpoint implements HeaderFilterStr
         undertowHttpBinding.setHeaderFilterStrategy(headerFilterStrategy);
     }
 
-    public SSLContext getSslContext() {
-        return sslContext;
+    public SSLContextParameters getSslContextParameters() {
+        return sslContextParameters;
     }
 
     /**
      * To configure security using SSLContextParameters
      */
-    public void setSslContext(SSLContext sslContext) {
-        this.sslContext = sslContext;
+    public void setSslContextParameters(SSLContextParameters sslContextParameters) {
+        this.sslContextParameters = sslContextParameters;
     }
 
     public Boolean getThrowExceptionOnFailure() {
@@ -198,4 +204,12 @@ public class UndertowEndpoint extends DefaultEndpoint implements HeaderFilterStr
         this.undertowHttpBinding = undertowHttpBinding;
     }
 
+    @Override
+    protected void doStart() throws Exception {
+        super.doStart();
+
+        if (sslContextParameters != null) {
+            sslContext = sslContextParameters.createSSLContext();
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/cdd64e10/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowHeaderTest.java
----------------------------------------------------------------------
diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowHeaderTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowHeaderTest.java
index b360c8a..3485da0 100644
--- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowHeaderTest.java
+++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowHeaderTest.java
@@ -24,15 +24,30 @@ public class UndertowHeaderTest extends BaseUndertowTest {
 
     @Test
     public void testHttpHeaders() throws Exception {
-        getMockEndpoint("mock:input").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:input").expectedMessageCount(1);
         getMockEndpoint("mock:input").expectedHeaderReceived("param", "true");
-        getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_METHOD, "POST");
+        getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_METHOD, "GET");
         getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_URL, "http://localhost:" + getPort() + "/headers");
         getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_URI, "/headers");
         getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_QUERY, "param=true");
         getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_PATH, "/headers");
 
-        String out = template.requestBody("http://localhost:" + getPort() + "/headers?param=true", "Hello World", String.class);
+        String out = template.requestBody("http://localhost:" + getPort() + "/headers?param=true", null, String.class);
+        assertEquals("Bye World", out);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
+    public void testHttpHeadersPost() throws Exception {
+        getMockEndpoint("mock:input").expectedBodiesReceived("Hello World");
+        getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_METHOD, "POST");
+        getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_URL, "http://localhost:" + getPort() + "/headers");
+        getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_URI, "/headers");
+        getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_QUERY, "");
+        getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_PATH, "/headers");
+
+        String out = template.requestBody("http://localhost:" + getPort() + "/headers", "Hello World", String.class);
         assertEquals("Bye World", out);
 
         assertMockEndpointsSatisfied();

http://git-wip-us.apache.org/repos/asf/camel/blob/cdd64e10/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 2fcd01c..bda4767 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
@@ -18,12 +18,10 @@ package org.apache.camel.component.undertow;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class UndertowProducerTest extends BaseUndertowTest {
 
-    @Ignore
     @Test
     public void testHttpSimple() throws Exception {
         getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_METHOD, "GET");
@@ -34,7 +32,6 @@ public class UndertowProducerTest extends BaseUndertowTest {
         assertMockEndpointsSatisfied();
     }
 
-    @Ignore
     @Test
     public void testHttpSimpleHeader() throws Exception {
         getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_METHOD, "POST");
@@ -45,7 +42,6 @@ public class UndertowProducerTest extends BaseUndertowTest {
         assertMockEndpointsSatisfied();
     }
 
-    @Ignore
     @Test
     public void testHttpSimpleHeaderAndBody() throws Exception {
 

http://git-wip-us.apache.org/repos/asf/camel/blob/cdd64e10/components/camel-undertow/src/test/resources/SpringTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-undertow/src/test/resources/SpringTest.xml b/components/camel-undertow/src/test/resources/SpringTest.xml
index e6baed9..eeee003 100644
--- a/components/camel-undertow/src/test/resources/SpringTest.xml
+++ b/components/camel-undertow/src/test/resources/SpringTest.xml
@@ -47,7 +47,7 @@
     </bean>
 
     <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
-        <endpoint id="input" uri="undertow:https://localhost:#{dynaPort}/spring?sslContextParametersRef=sslContextParameters"/>
+        <endpoint id="input" uri="undertow:https://localhost:#{dynaPort}/spring?sslContextParameters=#sslContextParameters"/>
 
         <route>
             <from ref="input"/>


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

Posted by da...@apache.org.
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/47f79a65
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/47f79a65
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/47f79a65

Branch: refs/heads/master
Commit: 47f79a65ea20a40c80b3502d8c766f1f72c3e3e8
Parents: cdd64e1
Author: Claus Ibsen <da...@apache.org>
Authored: Fri Jul 24 09:33:04 2015 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Fri Jul 24 09:33:04 2015 +0200

----------------------------------------------------------------------
 .../undertow/DefaultUndertowHttpBinding.java    |  10 +-
 .../component/undertow/UndertowComponent.java   |  21 ++-
 .../component/undertow/UndertowEndpoint.java    |   9 +-
 .../component/undertow/UndertowHelper.java      | 127 +++++++++++++++++++
 .../component/undertow/UndertowProducer.java    |  11 +-
 .../camel/component/undertow/UndertowUtils.java |  47 -------
 .../undertow/UndertowProducerTest.java          |  11 ++
 7 files changed, 176 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/47f79a65/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 e1d6c7e..e19d46d 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
@@ -137,7 +137,7 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding {
                 if (value != null && value.trim().startsWith("Basic")) {
                     if (headerFilterStrategy != null
                         && !headerFilterStrategy.applyFilterToExternalHeaders(Exchange.AUTHENTICATION, "Basic", exchange)) {
-                        UndertowUtils.appendHeader(headersMap, Exchange.AUTHENTICATION, "Basic");
+                        UndertowHelper.appendHeader(headersMap, Exchange.AUTHENTICATION, "Basic");
                     }
                 }
             }
@@ -149,7 +149,7 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding {
                 LOG.trace("HTTP-header: {}", value);
                 if (headerFilterStrategy != null
                     && !headerFilterStrategy.applyFilterToExternalHeaders(name.toString(), value, exchange)) {
-                    UndertowUtils.appendHeader(headersMap, name.toString(), value);
+                    UndertowHelper.appendHeader(headersMap, name.toString(), value);
                 }
             }
         }
@@ -168,7 +168,7 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding {
                     LOG.trace("URI-Parameter: {}", value);
                     if (headerFilterStrategy != null
                         && !headerFilterStrategy.applyFilterToExternalHeaders(name, value, exchange)) {
-                        UndertowUtils.appendHeader(headersMap, name, value);
+                        UndertowHelper.appendHeader(headersMap, name, value);
                     }
                 }
             }
@@ -194,7 +194,7 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding {
                 if (value != null && value.trim().startsWith("Basic")) {
                     if (headerFilterStrategy != null
                         && !headerFilterStrategy.applyFilterToExternalHeaders(Exchange.AUTHENTICATION, "Basic", exchange)) {
-                        UndertowUtils.appendHeader(headersMap, Exchange.AUTHENTICATION, "Basic");
+                        UndertowHelper.appendHeader(headersMap, Exchange.AUTHENTICATION, "Basic");
                     }
                 }
             }
@@ -206,7 +206,7 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding {
                 LOG.trace("HTTP-header: {}", value);
                 if (headerFilterStrategy != null
                     && !headerFilterStrategy.applyFilterToExternalHeaders(name.toString(), value, exchange)) {
-                    UndertowUtils.appendHeader(headersMap, name.toString(), value);
+                    UndertowHelper.appendHeader(headersMap, name.toString(), value);
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/camel/blob/47f79a65/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowComponent.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowComponent.java
index d037eae..84676b8 100644
--- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowComponent.java
+++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowComponent.java
@@ -53,13 +53,26 @@ public class UndertowComponent extends UriEndpointComponent implements RestConsu
 
     @Override
     protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
-        String address = remaining;
-        URI httpUri = new URI(UnsafeUriCharactersEncoder.encodeHttpURI(address));
-        URI endpointUri = URISupport.createRemainingURI(httpUri, parameters);
+        URI uriHttpUriAddress = new URI(UnsafeUriCharactersEncoder.encodeHttpURI(remaining));
+        URI endpointUri = URISupport.createRemainingURI(uriHttpUriAddress, parameters);
 
-        UndertowEndpoint endpoint = new UndertowEndpoint(endpointUri.toString(), this, httpUri);
+        // create the endpoint first
+        UndertowEndpoint endpoint = new UndertowEndpoint(endpointUri.toString(), this);
         endpoint.setUndertowHttpBinding(undertowHttpBinding);
         setProperties(endpoint, parameters);
+
+        // then re-create the http uri with the remaining parameters which the endpoint did not use
+        URI httpUri = URISupport.createRemainingURI(
+                new URI(uriHttpUriAddress.getScheme(),
+                        uriHttpUriAddress.getUserInfo(),
+                        uriHttpUriAddress.getHost(),
+                        uriHttpUriAddress.getPort(),
+                        uriHttpUriAddress.getPath(),
+                        uriHttpUriAddress.getQuery(),
+                        uriHttpUriAddress.getFragment()),
+                parameters);
+        endpoint.setHttpURI(httpUri);
+
         return endpoint;
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/47f79a65/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowEndpoint.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowEndpoint.java
index 1c25225..71899ca 100644
--- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowEndpoint.java
+++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowEndpoint.java
@@ -65,10 +65,9 @@ public class UndertowEndpoint extends DefaultEndpoint implements HeaderFilterStr
     @UriParam
     private Boolean transferException;
 
-    public UndertowEndpoint(String uri, UndertowComponent component, URI httpURI) throws URISyntaxException {
+    public UndertowEndpoint(String uri, UndertowComponent component) throws URISyntaxException {
         super(uri, component);
         this.component = component;
-        this.httpURI = httpURI;
     }
 
     @Override
@@ -97,6 +96,12 @@ public class UndertowEndpoint extends DefaultEndpoint implements HeaderFilterStr
         return true;
     }
 
+    @Override
+    public boolean isLenientProperties() {
+        // true to allow dynamic URI options to be configured and passed to external system for eg. the UndertowProducer
+        return true;
+    }
+
     public Exchange createExchange(HttpServerExchange httpExchange) throws Exception {
         Exchange exchange = createExchange();
 

http://git-wip-us.apache.org/repos/asf/camel/blob/47f79a65/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
new file mode 100644
index 0000000..8b55ccc
--- /dev/null
+++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowHelper.java
@@ -0,0 +1,127 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.undertow;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.RuntimeExchangeException;
+import org.apache.camel.util.URISupport;
+import org.apache.camel.util.UnsafeUriCharactersEncoder;
+
+/**
+ * Helper class for useful methods used all over the component
+ */
+public final class UndertowHelper {
+
+    private UndertowHelper() {
+    }
+
+    /**
+     * Creates the URL to invoke.
+     *
+     * @param exchange the exchange
+     * @param endpoint the endpoint
+     * @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();
+        }
+
+        // resolve placeholders in uri
+        try {
+            uri = exchange.getContext().resolvePropertyPlaceholders(uri);
+        } catch (Exception e) {
+            throw new RuntimeExchangeException("Cannot resolve property placeholders with uri: " + uri, exchange, e);
+        }
+
+        // append HTTP_PATH to HTTP_URI if it is provided in the header
+        String path = exchange.getIn().getHeader(Exchange.HTTP_PATH, String.class);
+        // NOW the HTTP_PATH is just related path, we don't need to trim it
+        if (path != null) {
+            if (path.startsWith("/")) {
+                path = path.substring(1);
+            }
+            if (path.length() > 0) {
+                // make sure that there is exactly one "/" between HTTP_URI and
+                // HTTP_PATH
+                if (!uri.endsWith("/")) {
+                    uri = uri + "/";
+                }
+                uri = uri.concat(path);
+            }
+        }
+
+        // ensure uri is encoded to be valid
+        uri = UnsafeUriCharactersEncoder.encodeHttpURI(uri);
+
+        return uri;
+    }
+
+    /**
+     * Creates the URI to invoke.
+     *
+     * @param exchange the exchange
+     * @param url      the url to invoke
+     * @param endpoint the endpoint
+     * @return the URI to invoke
+     */
+    public static URI createURI(Exchange exchange, String url, UndertowEndpoint endpoint) throws URISyntaxException {
+        URI uri = new URI(url);
+        // 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);
+        if (queryString == null) {
+            queryString = endpoint.getHttpURI().getRawQuery();
+        }
+        // We should user the query string from the HTTP_URI header
+        if (queryString == null) {
+            queryString = uri.getRawQuery();
+        }
+        if (queryString != null) {
+            // need to encode query string
+            queryString = UnsafeUriCharactersEncoder.encodeHttpURI(queryString);
+            uri = URISupport.createURIWithQuery(uri, queryString);
+        }
+        return uri;
+    }
+
+    public static void appendHeader(Map<String, Object> headers, String key, Object value) {
+        if (headers.containsKey(key)) {
+            Object existing = headers.get(key);
+            List<Object> list;
+            if (existing instanceof List) {
+                list = (List<Object>) existing;
+            } else {
+                list = new ArrayList<Object>();
+                list.add(existing);
+            }
+            list.add(value);
+            value = list;
+        }
+
+        headers.put(key, value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/47f79a65/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 fac4d8d..3f39e87 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
@@ -17,6 +17,7 @@
 package org.apache.camel.component.undertow;
 
 import java.io.IOException;
+import java.net.URI;
 import java.nio.ByteBuffer;
 
 import io.undertow.client.ClientCallback;
@@ -71,9 +72,15 @@ public class UndertowProducer extends DefaultAsyncProducer {
             IoFuture<ClientConnection> connect = client.connect(endpoint.getHttpURI(), worker,
                     new ByteBufferSlicePool(BufferAllocator.DIRECT_BYTE_BUFFER_ALLOCATOR, 8192, 8192 * 8192), OptionMap.EMPTY);
 
+            // creating the url to use takes 2-steps
+            String url = UndertowHelper.createURL(exchange, getEndpoint());
+            URI uri = UndertowHelper.createURI(exchange, url, getEndpoint());
+            // get the url from the uri
+            url = uri.toASCIIString();
+
             ClientRequest request = new ClientRequest();
             request.setProtocol(Protocols.HTTP_1_1);
-            request.setPath(endpoint.getHttpURI().getPath());
+            request.setPath(url);
 
             Object body = getRequestBody(request, exchange);
 
@@ -86,7 +93,7 @@ public class UndertowProducer extends DefaultAsyncProducer {
 
             connect.get().sendRequest(request, new UndertowProducerCallback(bodyAsByte, exchange, callback));
 
-        } catch (IOException e) {
+        } catch (Exception e) {
             exchange.setException(e);
             callback.done(true);
             return true;

http://git-wip-us.apache.org/repos/asf/camel/blob/47f79a65/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowUtils.java
----------------------------------------------------------------------
diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowUtils.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowUtils.java
deleted file mode 100644
index 43f2631..0000000
--- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowUtils.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.undertow;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Util class for useful methods used all over the component
- */
-public final class UndertowUtils {
-
-    private UndertowUtils() {
-    }
-
-    public static void appendHeader(Map<String, Object> headers, String key, Object value) {
-        if (headers.containsKey(key)) {
-            Object existing = headers.get(key);
-            List<Object> list;
-            if (existing instanceof List) {
-                list = (List<Object>) existing;
-            } else {
-                list = new ArrayList<Object>();
-                list.add(existing);
-            }
-            list.add(value);
-            value = list;
-        }
-
-        headers.put(key, value);
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/47f79a65/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 bda4767..ce24653 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
@@ -33,6 +33,17 @@ public class UndertowProducerTest extends BaseUndertowTest {
     }
 
     @Test
+    public void testHttpSimpleWithQuery() throws Exception {
+        getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_METHOD, "GET");
+        getMockEndpoint("mock:input").expectedHeaderReceived("name", "me");
+
+        String out = template.requestBody("undertow:http://localhost:{{port}}/foo?name=me", null, String.class);
+        assertEquals("Bye World", out);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
     public void testHttpSimpleHeader() throws Exception {
         getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_METHOD, "POST");
 


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

Posted by da...@apache.org.
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");