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");