CAMEL-6702: camel-http4 in bridge mode should not use cookie store. Also made it easy to configure a custom cookie store, and removed expired cookies by default.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/b3bc9bcc Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/b3bc9bcc Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/b3bc9bcc Branch: refs/heads/camel-2.11.x Commit: b3bc9bcc3c67e962f949f16a1fe986b0f592dcb5 Parents: 8384cff Author: Claus Ibsen <davscl...@apache.org> Authored: Tue Sep 3 13:15:23 2013 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Tue Sep 3 13:15:57 2013 +0200 ---------------------------------------------------------------------- .../camel/component/http4/HttpComponent.java | 15 +++++- .../camel/component/http4/HttpEndpoint.java | 32 +++++++++++- .../camel/component/http4/HttpProducer.java | 10 ++++ .../camel/component/http4/NoopCookieStore.java | 51 ++++++++++++++++++++ 4 files changed, 106 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/b3bc9bcc/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 de82932..a336ff5 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 @@ -31,6 +31,7 @@ import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.URISupport; import org.apache.camel.util.jsse.SSLContextParameters; import org.apache.http.auth.params.AuthParamBean; +import org.apache.http.client.CookieStore; import org.apache.http.client.params.ClientParamBean; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.params.ConnRouteParamBean; @@ -65,6 +66,7 @@ public class HttpComponent extends HeaderFilterStrategyComponent { protected HttpContext httpContext; protected SSLContextParameters sslContextParameters; protected X509HostnameVerifier x509HostnameVerifier = new BrowserCompatHostnameVerifier(); + protected CookieStore cookieStore; // options to the default created http connection manager protected int maxTotalConnections = 200; @@ -274,6 +276,9 @@ public class HttpComponent extends HeaderFilterStrategyComponent { if (httpContext != null) { endpoint.setHttpContext(httpContext); } + if (endpoint.getCookieStore() == null) { + endpoint.setCookieStore(getCookieStore()); + } // register port on schema registry registerPort(secure, x509HostnameVerifier, port, sslContextParameters); @@ -450,7 +455,15 @@ public class HttpComponent extends HeaderFilterStrategyComponent { public void setConnectionTimeToLive(long connectionTimeToLive) { this.connectionTimeToLive = connectionTimeToLive; } - + + public CookieStore getCookieStore() { + return cookieStore; + } + + public void setCookieStore(CookieStore cookieStore) { + this.cookieStore = cookieStore; + } + @Override public void doStart() throws Exception { super.doStart(); http://git-wip-us.apache.org/repos/asf/camel/blob/b3bc9bcc/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 fe1c583..d3170db 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 @@ -28,12 +28,16 @@ import org.apache.camel.spi.HeaderFilterStrategy; import org.apache.camel.spi.HeaderFilterStrategyAware; 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; @@ -64,6 +68,8 @@ public class HttpEndpoint extends DefaultPollingEndpoint implements HeaderFilter private boolean traceEnabled; private String httpMethodRestrict; private UrlRewrite urlRewrite; + private boolean clearExpiredCookies = true; + private CookieStore cookieStore; public HttpEndpoint() { } @@ -124,7 +130,10 @@ public class HttpEndpoint extends DefaultPollingEndpoint implements HeaderFilter ObjectHelper.notNull(clientParams, "clientParams"); ObjectHelper.notNull(clientConnectionManager, "httpConnectionManager"); - HttpClient answer = new DefaultHttpClient(clientConnectionManager, getClientParams()); + DefaultHttpClient answer = new DefaultHttpClient(clientConnectionManager, getClientParams()); + if (cookieStore != null) { + answer.setCookieStore(cookieStore); + } // configure http proxy from camelContext if (ObjectHelper.isNotEmpty(getCamelContext().getProperty("http.proxyHost")) && ObjectHelper.isNotEmpty(getCamelContext().getProperty("http.proxyPort"))) { @@ -150,6 +159,11 @@ public class HttpEndpoint extends DefaultPollingEndpoint implements HeaderFilter configurer.configureHttpClient(answer); } + if (isBridgeEndpoint()) { + // need to use noop cookiestore as we do not want to keep cookies in memory + answer.setCookieStore(new NoopCookieStore()); + } + LOG.debug("Created HttpClient {}", answer); return answer; } @@ -347,4 +361,20 @@ public class HttpEndpoint extends DefaultPollingEndpoint implements HeaderFilter public void setUrlRewrite(UrlRewrite urlRewrite) { this.urlRewrite = urlRewrite; } + + public boolean isClearExpiredCookies() { + return clearExpiredCookies; + } + + public void setClearExpiredCookies(boolean clearExpiredCookies) { + this.clearExpiredCookies = clearExpiredCookies; + } + + public CookieStore getCookieStore() { + return cookieStore; + } + + public void setCookieStore(CookieStore cookieStore) { + this.cookieStore = cookieStore; + } } http://git-wip-us.apache.org/repos/asf/camel/blob/b3bc9bcc/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java index 135c0ec..91ba769 100644 --- a/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java +++ b/components/camel-http4/src/main/java/org/apache/camel/component/http4/HttpProducer.java @@ -26,6 +26,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.Charset; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -57,6 +58,7 @@ import org.apache.http.entity.ContentType; import org.apache.http.entity.FileEntity; import org.apache.http.entity.InputStreamEntity; import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreProtocolPNames; import org.apache.http.protocol.HttpContext; import org.apache.http.util.EntityUtils; @@ -82,6 +84,14 @@ public class HttpProducer extends DefaultProducer { } public void process(Exchange exchange) throws Exception { + + if (getEndpoint().isClearExpiredCookies()) { + if (httpClient instanceof DefaultHttpClient) { + boolean cleared = ((DefaultHttpClient) httpClient).getCookieStore().clearExpired(new Date()); + log.debug("Any expired cookies cleared: {}", cleared); + } + } + // if we bridge endpoint then we need to skip matching headers with the HTTP_QUERY to avoid sending // duplicated headers to the receiver, so use this skipRequestHeaders as the list of headers to skip Map<String, Object> skipRequestHeaders = null; http://git-wip-us.apache.org/repos/asf/camel/blob/b3bc9bcc/components/camel-http4/src/main/java/org/apache/camel/component/http4/NoopCookieStore.java ---------------------------------------------------------------------- diff --git a/components/camel-http4/src/main/java/org/apache/camel/component/http4/NoopCookieStore.java b/components/camel-http4/src/main/java/org/apache/camel/component/http4/NoopCookieStore.java new file mode 100644 index 0000000..85221d9 --- /dev/null +++ b/components/camel-http4/src/main/java/org/apache/camel/component/http4/NoopCookieStore.java @@ -0,0 +1,51 @@ +/** + * 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 java.util.Collections; +import java.util.Date; +import java.util.List; + +import org.apache.http.client.CookieStore; +import org.apache.http.cookie.Cookie; + +/** + * A noop {@link CookieStore} used when bridging endpoints. + */ +public class NoopCookieStore implements CookieStore { + + @Override + public void addCookie(Cookie cookie) { + // noop + } + + @Override + @SuppressWarnings("unchecked") + public List<Cookie> getCookies() { + return Collections.EMPTY_LIST; + } + + @Override + public boolean clearExpired(Date date) { + return false; + } + + @Override + public void clear() { + // noop + } +}