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 2013/10/21 14:49:39 UTC
[2/2] git commit: CAMEL-6880: camel-http4 should support custom
component names,
and each may be configured different SSL context etc. Also getEndpointUri
should use the custom component name.
CAMEL-6880: camel-http4 should support custom component names, and each may be configured different SSL context etc. Also getEndpointUri should use the custom component name.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/9da37053
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/9da37053
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/9da37053
Branch: refs/heads/camel-2.11.x
Commit: 9da3705321570f84d900a78087ce8d4818ce8e87
Parents: 561c786
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Oct 21 14:40:22 2013 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Oct 21 14:48:14 2013 +0200
----------------------------------------------------------------------
.../camel/component/http4/HttpComponent.java | 71 ++++++++++++--------
.../camel/component/http4/HttpEndpoint.java | 3 -
.../HttpBodyWithOtherProtocalNameTest.java | 2 +-
.../http4/HttpCustomComponentNameTest.java | 52 ++++++++++++++
.../component/http4/HttpProxyServerTest.java | 3 +-
...woComponentsSslContextParametersGetTest.java | 71 ++++++++++++++++++++
6 files changed, 168 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/9da37053/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpComponent.java b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpComponent.java
index a336ff5..13b9b08 100644
--- a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpComponent.java
+++ b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpComponent.java
@@ -29,6 +29,7 @@ import org.apache.camel.spi.HeaderFilterStrategy;
import org.apache.camel.util.IntrospectionSupport;
import org.apache.camel.util.ObjectHelper;
import org.apache.camel.util.URISupport;
+import org.apache.camel.util.UnsafeUriCharactersEncoder;
import org.apache.camel.util.jsse.SSLContextParameters;
import org.apache.http.auth.params.AuthParamBean;
import org.apache.http.client.CookieStore;
@@ -168,10 +169,6 @@ public class HttpComponent extends HeaderFilterStrategyComponent {
@Override
protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
- String addressUri = uri;
- if (!uri.startsWith("http4:") && !uri.startsWith("https4:")) {
- addressUri = remaining;
- }
Map<String, Object> httpClientParameters = new HashMap<String, Object>(parameters);
// http client can be configured from URI options
HttpParams clientParams = configureHttpParams(parameters);
@@ -208,13 +205,52 @@ public class HttpComponent extends HeaderFilterStrategyComponent {
HeaderFilterStrategy headerFilterStrategy = resolveAndRemoveReferenceParameter(parameters, "headerFilterStrategy", HeaderFilterStrategy.class);
UrlRewrite urlRewrite = resolveAndRemoveReferenceParameter(parameters, "urlRewrite", UrlRewrite.class);
- boolean secure = HttpHelper.isSecureConnection(uri);
+ boolean secure = HttpHelper.isSecureConnection(uri) || sslContextParameters != null;
+
+ // need to set scheme on address uri depending on if its secure or not
+ String addressUri = remaining.startsWith("http") ? remaining : null;
+ if (addressUri == null) {
+ if (secure) {
+ addressUri = "https://" + remaining;
+ } else {
+ addressUri = "http://" + remaining;
+ }
+ }
+ addressUri = UnsafeUriCharactersEncoder.encode(addressUri);
+ URI uriHttpUriAddress = new URI(addressUri);
+
+ // validate http uri that end-user did not duplicate the http part that can be a common error
+ int pos = uri.indexOf("//");
+ if (pos != -1) {
+ String part = uri.substring(pos + 2);
+ if (part.startsWith("http:") || part.startsWith("https:")) {
+ throw new ResolveEndpointFailedException(uri,
+ "The uri part is not configured correctly. You have duplicated the http(s) protocol.");
+ }
+ }
// create the configurer to use for this endpoint
HttpClientConfigurer configurer = createHttpClientConfigurer(parameters, secure);
- URI endpointUri = URISupport.createRemainingURI(new URI(addressUri), httpClientParameters);
+ URI endpointUri = URISupport.createRemainingURI(uriHttpUriAddress, httpClientParameters);
+
+
+ // the endpoint uri should use the component name as scheme, so we need to re-create it once more
+ String scheme = ObjectHelper.before(uri, "://");
+ endpointUri = URISupport.createRemainingURI(
+ new URI(scheme,
+ endpointUri.getUserInfo(),
+ endpointUri.getHost(),
+ endpointUri.getPort(),
+ endpointUri.getPath(),
+ endpointUri.getQuery(),
+ endpointUri.getFragment()),
+ httpClientParameters);
+
// create the endpoint and set the http uri to be null
- HttpEndpoint endpoint = new HttpEndpoint(endpointUri.toString(), this, clientParams, clientConnectionManager, configurer);
+ String endpointUriString = endpointUri.toString();
+
+ LOG.debug("Creating endpoint uri {}", endpointUriString);
+ HttpEndpoint endpoint = new HttpEndpoint(endpointUriString, this, clientParams, clientConnectionManager, configurer);
if (urlRewrite != null) {
// let CamelContext deal with the lifecycle of the url rewrite
// this ensures its being shutdown when Camel shutdown etc.
@@ -223,27 +259,6 @@ public class HttpComponent extends HeaderFilterStrategyComponent {
}
// configure the endpoint
setProperties(endpoint, parameters);
- // The httpUri should be start with http or https
- String httpUriAddress = addressUri;
- if (addressUri.startsWith("http4")) {
- httpUriAddress = "http" + addressUri.substring(5);
- }
- if (addressUri.startsWith("https4")) {
- httpUriAddress = "https" + addressUri.substring(6);
- }
- // restructure uri to be based on the parameters left as we dont want to include the Camel internal options
- // build up the http uri
- URI uriHttpUriAddress = new URI(httpUriAddress);
-
- // validate http uri that end-user did not duplicate the http part that can be a common error
- String part = uriHttpUriAddress.getSchemeSpecificPart();
- if (part != null) {
- part = part.toLowerCase();
- if (part.startsWith("//http//") || part.startsWith("//https//") || part.startsWith("//http://") || part.startsWith("//https://")) {
- throw new ResolveEndpointFailedException(uri,
- "The uri part is not configured correctly. You have duplicated the http(s) protocol.");
- }
- }
// determine the portnumber (special case: default portnumber)
int port = getPort(uriHttpUriAddress);
http://git-wip-us.apache.org/repos/asf/camel/blob/9da37053/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpEndpoint.java b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpEndpoint.java
index d3170db..e63e380 100644
--- a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpEndpoint.java
+++ b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpEndpoint.java
@@ -30,14 +30,11 @@ import org.apache.camel.util.ObjectHelper;
import org.apache.http.HttpHost;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpClient;
-import org.apache.http.client.protocol.ClientContext;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.DefaultedHttpContext;
import org.apache.http.protocol.HttpContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
http://git-wip-us.apache.org/repos/asf/camel/blob/9da37053/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpBodyWithOtherProtocalNameTest.java
----------------------------------------------------------------------
diff --git a/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpBodyWithOtherProtocalNameTest.java b/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpBodyWithOtherProtocalNameTest.java
index bc10135..9185765 100644
--- a/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpBodyWithOtherProtocalNameTest.java
+++ b/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpBodyWithOtherProtocalNameTest.java
@@ -25,7 +25,7 @@ public class HttpBodyWithOtherProtocalNameTest extends HttpBodyTest {
@Override
public void setUp() throws Exception {
super.setUp();
- setProtocolString("newHttp://http://");
+ setProtocolString("newHttp://");
}
public CamelContext createCamelContext() throws Exception {
http://git-wip-us.apache.org/repos/asf/camel/blob/9da37053/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpCustomComponentNameTest.java
----------------------------------------------------------------------
diff --git a/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpCustomComponentNameTest.java b/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpCustomComponentNameTest.java
new file mode 100644
index 0000000..7a33b83
--- /dev/null
+++ b/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpCustomComponentNameTest.java
@@ -0,0 +1,52 @@
+/**
+ * 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.http4;
+
+import org.apache.camel.Component;
+import org.apache.camel.Endpoint;
+import org.apache.camel.test.AvailablePortFinder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.camel.util.ServiceHelper;
+import org.junit.Test;
+
+public class HttpCustomComponentNameTest extends CamelTestSupport {
+
+ @Override
+ public boolean isUseRouteBuilder() {
+ return false;
+ }
+
+ @Test
+ public void testCustomName() throws Exception {
+ context.start();
+
+ int port = AvailablePortFinder.getNextAvailable(24400);
+
+ Component custom = new HttpComponent();
+ context.addComponent("http-foo", custom);
+ ServiceHelper.startService(custom);
+
+ String uri = "http-foo://www.somewhere.com:" + port + "?q=Camel";
+ Endpoint endpoint = context.getEndpoint(uri);
+ assertNotNull(endpoint);
+ // the endpoint uri should use the custom component name as scheme
+ assertEquals(uri, endpoint.getEndpointUri());
+
+ context.stop();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/9da37053/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpProxyServerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpProxyServerTest.java b/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpProxyServerTest.java
index b374701..b92f313 100644
--- a/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpProxyServerTest.java
+++ b/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpProxyServerTest.java
@@ -87,7 +87,6 @@ public class HttpProxyServerTest extends BaseHttpTest {
HttpEndpoint http1 = context.getEndpoint("http4://www.google.com?proxyAuthHost=myproxy&proxyAuthPort=1234", HttpEndpoint.class);
HttpEndpoint http2 = context.getEndpoint("http4://www.google.com?test=parameter&proxyAuthHost=myotherproxy&proxyAuthPort=2345", HttpEndpoint.class);
-
HttpClient client1 = http1.createHttpClient();
HttpHost proxy1 = (HttpHost)client1.getParams().getParameter(ConnRoutePNames.DEFAULT_PROXY);
assertEquals("myproxy", proxy1.getHostName());
@@ -98,7 +97,7 @@ public class HttpProxyServerTest extends BaseHttpTest {
assertEquals("myotherproxy", proxy2.getHostName());
assertEquals(2345, proxy2.getPort());
- //As the endpointUri is recreated, so the parameter could be in different place, so we use the URISupport.normalizeUri
+ //As the endpointUri is recreated, so the parameter could be in different place, so we use the URISupport.normalizeUri
assertEquals("Get a wrong endpoint uri of http1", "http4://www.google.com?proxyAuthHost=myproxy&proxyAuthPort=1234", URISupport.normalizeUri(http1.getEndpointUri()));
assertEquals("Get a wrong endpoint uri of http2", "http4://www.google.com?proxyAuthHost=myotherproxy&proxyAuthPort=2345&test=parameter", URISupport.normalizeUri(http2.getEndpointUri()));
http://git-wip-us.apache.org/repos/asf/camel/blob/9da37053/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpsTwoComponentsSslContextParametersGetTest.java
----------------------------------------------------------------------
diff --git a/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpsTwoComponentsSslContextParametersGetTest.java b/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpsTwoComponentsSslContextParametersGetTest.java
new file mode 100644
index 0000000..e377c04
--- /dev/null
+++ b/components/camel-http4/src/test/java/org/apache/camel/component/http4/HttpsTwoComponentsSslContextParametersGetTest.java
@@ -0,0 +1,71 @@
+/**
+ * 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.http4;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.test.AvailablePortFinder;
+import org.apache.camel.util.jsse.SSLContextParameters;
+import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
+import org.junit.Test;
+
+public class HttpsTwoComponentsSslContextParametersGetTest extends BaseHttpsTest {
+
+ private int port2;
+
+ @Override
+ protected JndiRegistry createRegistry() throws Exception {
+ JndiRegistry registry = super.createRegistry();
+ registry.bind("x509HostnameVerifier", new AllowAllHostnameVerifier());
+ registry.bind("sslContextParameters", new SSLContextParameters());
+ registry.bind("sslContextParameters2", new SSLContextParameters());
+
+ registry.bind("http4s-foo", new HttpComponent());
+ registry.bind("http4s-bar", new HttpComponent());
+
+ return registry;
+ }
+
+ @Override
+ public boolean isUseRouteBuilder() {
+ return false;
+ }
+
+ @Test
+ public void httpsTwoDifferentSSLContextNotSupported() throws Exception {
+ context.addRoutes(new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ port2 = getPort() + 1;
+
+ from("direct:foo")
+ .to("http4s-foo://127.0.0.1:" + getPort() + "/mail?x509HostnameVerifier=x509HostnameVerifier&sslContextParametersRef=sslContextParameters");
+
+ from("direct:bar")
+ .to("http4s-bar://127.0.0.1:" + port2 + "/mail?x509HostnameVerifier=x509HostnameVerifier&sslContextParametersRef=sslContextParameters2");
+ }
+ });
+
+ context.start();
+
+ // should be able to startup
+ Thread.sleep(500);
+
+ context.stop();
+ }
+
+}