This is an automated email from the ASF dual-hosted git repository. nfilotto pushed a commit to branch CAMEL-19191/downgrade-httpcomponents-to-5.1 in repository https://gitbox.apache.org/repos/asf/camel.git
commit 6a224824d6ddcd6bd61dc8c64614096cf0ef3698 Author: Nicolas Filotto <[email protected]> AuthorDate: Fri Mar 24 15:50:14 2023 +0100 CAMEL-19191: Use 5.1.x version to be compatible with SB --- camel-dependencies/pom.xml | 2 +- .../component/http/HttpComponentConfigurer.java | 6 ---- .../org/apache/camel/component/http/http.json | 1 - .../org/apache/camel/component/http/https.json | 1 - .../camel-http/src/main/docs/http-component.adoc | 26 ++++++++++------ .../apache/camel/component/http/HttpComponent.java | 35 +++------------------- .../apache/camel/component/http/HttpEndpoint.java | 18 ----------- .../apache/camel/component/http/HttpProducer.java | 3 +- .../ROOT/pages/camel-4-migration-guide.adoc | 10 +++---- parent/pom.xml | 2 +- 10 files changed, 29 insertions(+), 75 deletions(-) diff --git a/camel-dependencies/pom.xml b/camel-dependencies/pom.xml index ba4245404c1..a354b5fcea9 100644 --- a/camel-dependencies/pom.xml +++ b/camel-dependencies/pom.xml @@ -217,7 +217,7 @@ <hsqldb-version>2.7.1</hsqldb-version> <httpunit-version>1.7</httpunit-version> <httpcore-version>5.2.1</httpcore-version> - <httpclient-version>5.2.1</httpclient-version> + <httpclient-version>5.1.4</httpclient-version> <httpcore4-version>4.4.16</httpcore4-version> <httpclient4-version>4.5.14</httpclient4-version> <httpasyncclient-version>4.1.5</httpasyncclient-version> diff --git a/components/camel-http/src/generated/java/org/apache/camel/component/http/HttpComponentConfigurer.java b/components/camel-http/src/generated/java/org/apache/camel/component/http/HttpComponentConfigurer.java index 58d39840502..ea1f621a314 100644 --- a/components/camel-http/src/generated/java/org/apache/camel/component/http/HttpComponentConfigurer.java +++ b/components/camel-http/src/generated/java/org/apache/camel/component/http/HttpComponentConfigurer.java @@ -95,8 +95,6 @@ public class HttpComponentConfigurer extends PropertyConfigurerSupport implement case "skipResponseHeaders": target.setSkipResponseHeaders(property(camelContext, boolean.class, value)); return true; case "sotimeout": case "soTimeout": target.setSoTimeout(property(camelContext, org.apache.hc.core5.util.Timeout.class, value)); return true; - case "sockettimeout": - case "socketTimeout": target.setSocketTimeout(property(camelContext, org.apache.hc.core5.util.Timeout.class, value)); return true; case "sslcontextparameters": case "sslContextParameters": target.setSslContextParameters(property(camelContext, org.apache.camel.support.jsse.SSLContextParameters.class, value)); return true; case "useglobalsslcontextparameters": @@ -184,8 +182,6 @@ public class HttpComponentConfigurer extends PropertyConfigurerSupport implement case "skipResponseHeaders": return boolean.class; case "sotimeout": case "soTimeout": return org.apache.hc.core5.util.Timeout.class; - case "sockettimeout": - case "socketTimeout": return org.apache.hc.core5.util.Timeout.class; case "sslcontextparameters": case "sslContextParameters": return org.apache.camel.support.jsse.SSLContextParameters.class; case "useglobalsslcontextparameters": @@ -274,8 +270,6 @@ public class HttpComponentConfigurer extends PropertyConfigurerSupport implement case "skipResponseHeaders": return target.isSkipResponseHeaders(); case "sotimeout": case "soTimeout": return target.getSoTimeout(); - case "sockettimeout": - case "socketTimeout": return target.getSocketTimeout(); case "sslcontextparameters": case "sslContextParameters": return target.getSslContextParameters(); case "useglobalsslcontextparameters": diff --git a/components/camel-http/src/generated/resources/org/apache/camel/component/http/http.json b/components/camel-http/src/generated/resources/org/apache/camel/component/http/http.json index 2cf9827c77e..b53ad508b86 100644 --- a/components/camel-http/src/generated/resources/org/apache/camel/component/http/http.json +++ b/components/camel-http/src/generated/resources/org/apache/camel/component/http/http.json @@ -64,7 +64,6 @@ "connectionRequestTimeout": { "kind": "property", "displayName": "Connection Request Timeout", "group": "timeout", "label": "timeout", "required": false, "type": "object", "javaType": "org.apache.hc.core5.util.Timeout", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3 minutes", "description": "Returns the connection lease request timeout used when requesting a connection from the connection manager. A timeout value of zero is interpreted as a disabled time [...] "connectTimeout": { "kind": "property", "displayName": "Connect Timeout", "group": "timeout", "label": "timeout", "required": false, "type": "object", "javaType": "org.apache.hc.core5.util.Timeout", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3 minutes", "description": "Determines the timeout until a new connection is fully established. A timeout value of zero is interpreted as an infinite timeout." }, "responseTimeout": { "kind": "property", "displayName": "Response Timeout", "group": "timeout", "label": "timeout", "required": false, "type": "object", "javaType": "org.apache.hc.core5.util.Timeout", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "0", "description": "Determines the timeout until arrival of a response from the opposite endpoint. A timeout value of zero is interpreted as an infinite timeout. Please note that response timeout may be unsupport [...] - "socketTimeout": { "kind": "property", "displayName": "Socket Timeout", "group": "timeout", "label": "timeout", "required": false, "type": "object", "javaType": "org.apache.hc.core5.util.Timeout", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "null (undefined)", "description": "Determines the default socket timeout value for I\/O operations." }, "soTimeout": { "kind": "property", "displayName": "So Timeout", "group": "timeout", "label": "timeout", "required": false, "type": "object", "javaType": "org.apache.hc.core5.util.Timeout", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3 minutes", "description": "Determines the default socket timeout value for blocking I\/O operations." } }, "headers": { diff --git a/components/camel-http/src/generated/resources/org/apache/camel/component/http/https.json b/components/camel-http/src/generated/resources/org/apache/camel/component/http/https.json index 36e3597ad93..8769a911e4a 100644 --- a/components/camel-http/src/generated/resources/org/apache/camel/component/http/https.json +++ b/components/camel-http/src/generated/resources/org/apache/camel/component/http/https.json @@ -64,7 +64,6 @@ "connectionRequestTimeout": { "kind": "property", "displayName": "Connection Request Timeout", "group": "timeout", "label": "timeout", "required": false, "type": "object", "javaType": "org.apache.hc.core5.util.Timeout", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3 minutes", "description": "Returns the connection lease request timeout used when requesting a connection from the connection manager. A timeout value of zero is interpreted as a disabled time [...] "connectTimeout": { "kind": "property", "displayName": "Connect Timeout", "group": "timeout", "label": "timeout", "required": false, "type": "object", "javaType": "org.apache.hc.core5.util.Timeout", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3 minutes", "description": "Determines the timeout until a new connection is fully established. A timeout value of zero is interpreted as an infinite timeout." }, "responseTimeout": { "kind": "property", "displayName": "Response Timeout", "group": "timeout", "label": "timeout", "required": false, "type": "object", "javaType": "org.apache.hc.core5.util.Timeout", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "0", "description": "Determines the timeout until arrival of a response from the opposite endpoint. A timeout value of zero is interpreted as an infinite timeout. Please note that response timeout may be unsupport [...] - "socketTimeout": { "kind": "property", "displayName": "Socket Timeout", "group": "timeout", "label": "timeout", "required": false, "type": "object", "javaType": "org.apache.hc.core5.util.Timeout", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "null (undefined)", "description": "Determines the default socket timeout value for I\/O operations." }, "soTimeout": { "kind": "property", "displayName": "So Timeout", "group": "timeout", "label": "timeout", "required": false, "type": "object", "javaType": "org.apache.hc.core5.util.Timeout", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "3 minutes", "description": "Determines the default socket timeout value for blocking I\/O operations." } }, "headers": { diff --git a/components/camel-http/src/main/docs/http-component.adoc b/components/camel-http/src/main/docs/http-component.adoc index 64d9794e2d1..24bd6686bad 100644 --- a/components/camel-http/src/main/docs/http-component.adoc +++ b/components/camel-http/src/main/docs/http-component.adoc @@ -402,17 +402,17 @@ Spring DSL based configuration of endpoint Configuring Apache HTTP Client Directly Basically camel-http component is built on the top of -http://hc.apache.org/httpcomponents-client-ga/[Apache HttpClient]. +https://hc.apache.org/httpcomponents-client-5.1.x/[Apache HttpClient]. Please refer to https://hc.apache.org/httpcomponents-client-4.5.x/current/tutorial/html/connmgmt.html[SSL/TLS -customization] for details or have a look into the +customization] (even if the link is referring to an article about version 4, it is still more or less relevant moreover there is no equivalent for version 5) for details or have a look into the `org.apache.camel.component.http.HttpsServerTestSupport` unit test base class. + You can also implement a custom `org.apache.camel.component.http.HttpClientConfigurer` to do some configuration on the http client if you need full control of it. -However if you _just_ want to specify the keystore and truststore you +However, if you _just_ want to specify the keystore and truststore you can do this with Apache HTTP `HttpClientConfigurer`, for example: [source,java] @@ -447,7 +447,7 @@ If you are doing this using the Spring DSL, you can specify your <to uri="https://myhostname.com:443/myURL?httpClientConfigurer=myHttpClientConfigurer"/> ----------------------------------------------------------------------------------------- -As long as you implement the HttpClientConfigurer and configure your +As long as you implement the `HttpClientConfigurer` and configure your keystore and truststore as described above, it will work fine. [[HTTP-UsingHTTPStoauthenticategotchas]] @@ -455,7 +455,7 @@ Using HTTPS to authenticate gotchas An end user reported that he had problem with authenticating with HTTPS. The problem was eventually resolved by providing a custom configured -`org.apache.http.protocol.HttpContext`: +`org.apache.hc.core5.http.protocol.HttpContext`: * 1. Create a (Spring) factory for HttpContexts: @@ -465,15 +465,23 @@ public class HttpContextFactory { private String httpHost = "localhost"; private String httpPort = 9001; + private String user = "some-user"; + private String password = "my-secret"; - private BasicHttpContext httpContext = new BasicHttpContext(); + private HttpClientContext context = HttpClientContext.create(); private BasicAuthCache authCache = new BasicAuthCache(); private BasicScheme basicAuth = new BasicScheme(); public HttpContext getObject() { - authCache.put(new HttpHost(httpHost, httpPort), basicAuth); + UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(user, password.toCharArray()); + BasicCredentialsProvider provider = new BasicCredentialsProvider(); + HttpHost host = new HttpHost(httpHost, httpPort); + provider.setCredentials(host, credentials); - httpContext.setAttribute(ClientContext.AUTH_CACHE, authCache); + authCache.put(host, basicAuth); + + httpContext.setAuthCache(authCache); + httpContext.setCredentialsProvider(provider); return httpContext; } @@ -482,7 +490,7 @@ public class HttpContextFactory { } ------------------------------------------------------------------ -* 2. Declare an HttpContext in the Spring application context file: +* 2. Declare an` HttpContext` in the Spring application context file: [source,xml] --------------------------------------------------------------------------------------- diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java index 322831c8566..974fb3c49df 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpComponent.java @@ -53,7 +53,6 @@ import org.apache.camel.util.PropertiesHelper; import org.apache.camel.util.StringHelper; import org.apache.camel.util.URISupport; import org.apache.camel.util.UnsafeUriCharactersEncoder; -import org.apache.hc.client5.http.config.ConnectionConfig; import org.apache.hc.client5.http.config.RequestConfig; import org.apache.hc.client5.http.cookie.CookieStore; import org.apache.hc.client5.http.impl.DefaultRedirectStrategy; @@ -118,10 +117,6 @@ public class HttpComponent extends HttpCommonComponent implements RestProducerFa + " A timeout value of zero is interpreted as an infinite timeout.", javaType = "org.apache.hc.core5.util.Timeout") protected Timeout connectTimeout = Timeout.ofMinutes(3); - @Metadata(label = "timeout", defaultValue = "null (undefined)", - description = "Determines the default socket timeout value for I/O operations.", - javaType = "org.apache.hc.core5.util.Timeout") - protected Timeout socketTimeout; @Metadata(label = "timeout", defaultValue = "3 minutes", description = "Determines the default socket timeout value for blocking I/O operations.", javaType = "org.apache.hc.core5.util.Timeout") @@ -315,15 +310,11 @@ public class HttpComponent extends HttpCommonComponent implements RestProducerFa if (!Timeout.ofMilliseconds(0).equals(valResponseTimeout)) { httpClientOptions.put("responseTimeout", valResponseTimeout); } - final Map<String, Object> httpConnectionOptions = new HashMap<>(); Timeout valConnectTimeout = getAndRemoveParameter(parameters, "connectTimeout", Timeout.class, connectTimeout); if (!Timeout.ofMinutes(3).equals(valConnectTimeout)) { - httpConnectionOptions.put("connectTimeout", valConnectTimeout); - } - Timeout valSocketTimeout = getAndRemoveParameter(parameters, "socketTimeout", Timeout.class, socketTimeout); - if (valSocketTimeout != null) { - httpConnectionOptions.put("socketTimeout", valSocketTimeout); + httpClientOptions.put("connectTimeout", valConnectTimeout); } + final Map<String, Object> httpConnectionOptions = new HashMap<>(); Timeout valSoTimeout = getAndRemoveParameter(parameters, "soTimeout", Timeout.class, soTimeout); if (!Timeout.ofMinutes(3).equals(valSoTimeout)) { httpConnectionOptions.put("soTimeout", valSoTimeout); @@ -396,7 +387,6 @@ public class HttpComponent extends HttpCommonComponent implements RestProducerFa final HttpClientBuilder clientBuilder = createHttpClientBuilder(uri, parameters, httpClientOptions); HttpEndpoint endpoint = new HttpEndpoint(endpointUriString, this, clientBuilder, localConnectionManager, configurer); endpoint.setResponseTimeout(valResponseTimeout); - endpoint.setSocketTimeout(valSocketTimeout); endpoint.setSoTimeout(valSoTimeout); endpoint.setConnectTimeout(valConnectTimeout); endpoint.setConnectionRequestTimeout(valConnectionRequestTimeout); @@ -480,11 +470,9 @@ public class HttpComponent extends HttpCommonComponent implements RestProducerFa httpConnectionOptions.putAll(PropertiesHelper.extractProperties(parameters, "httpConnection.")); SocketConfig.Builder socketConfigBuilder = SocketConfig.custom(); PropertyBindingSupport.bindProperties(getCamelContext(), socketConfigBuilder, httpConnectionOptions); - ConnectionConfig.Builder connectionConfigBuilder = ConnectionConfig.custom(); - PropertyBindingSupport.bindProperties(getCamelContext(), connectionConfigBuilder, httpConnectionOptions); return createConnectionManager(connectionRegistry, maxTotalConnections, connectionsPerRoute, - socketConfigBuilder.build(), connectionConfigBuilder.build()); + socketConfigBuilder.build()); } protected HttpClientBuilder createHttpClientBuilder( @@ -554,7 +542,7 @@ public class HttpComponent extends HttpCommonComponent implements RestProducerFa protected HttpClientConnectionManager createConnectionManager( Registry<ConnectionSocketFactory> registry, int maxTotalConnections, int connectionsPerRoute, - SocketConfig defaultSocketConfig, ConnectionConfig defaultConnectionConfig) { + SocketConfig defaultSocketConfig) { // setup the connection live time PoolingHttpClientConnectionManager answer = new PoolingHttpClientConnectionManager( registry, PoolConcurrencyPolicy.STRICT, TimeValue.ofMilliseconds(getConnectionTimeToLive()), null); @@ -566,7 +554,6 @@ public class HttpComponent extends HttpCommonComponent implements RestProducerFa answer.setMaxTotal(localMaxTotalConnections); } answer.setDefaultSocketConfig(defaultSocketConfig); - answer.setDefaultConnectionConfig(defaultConnectionConfig); int localConnectionsPerRoute = connectionsPerRoute; if (localConnectionsPerRoute == 0) { localConnectionsPerRoute = getConnectionsPerRoute(); @@ -796,20 +783,6 @@ public class HttpComponent extends HttpCommonComponent implements RestProducerFa this.connectTimeout = connectTimeout; } - public Timeout getSocketTimeout() { - return socketTimeout; - } - - /** - * Determines the default socket timeout value for I/O operations. - * <p> - * Default: {@code null} (undefined) - * </p> - */ - public void setSocketTimeout(Timeout socketTimeout) { - this.socketTimeout = socketTimeout; - } - public Timeout getSoTimeout() { return soTimeout; } diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java index bdf448ae8b2..309ef7ff39c 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpEndpoint.java @@ -104,10 +104,6 @@ public class HttpEndpoint extends HttpCommonEndpoint { + " A timeout value of zero is interpreted as an infinite timeout.", javaType = "org.apache.hc.core5.util.Timeout") private Timeout connectTimeout = Timeout.ofMinutes(3); - @Metadata(label = "timeout", defaultValue = "null (undefined)", - description = "Determines the default socket timeout value for I/O operations.", - javaType = "org.apache.hc.core5.util.Timeout") - private Timeout socketTimeout; @Metadata(label = "timeout", defaultValue = "3 minutes", description = "Determines the default socket timeout value for blocking I/O operations.", javaType = "org.apache.hc.core5.util.Timeout") @@ -544,20 +540,6 @@ public class HttpEndpoint extends HttpCommonEndpoint { this.connectTimeout = connectTimeout; } - public Timeout getSocketTimeout() { - return socketTimeout; - } - - /** - * Determines the default socket timeout value for I/O operations. - * <p> - * Default: {@code null} (undefined) - * </p> - */ - public void setSocketTimeout(Timeout socketTimeout) { - this.socketTimeout = socketTimeout; - } - public Timeout getSoTimeout() { return soTimeout; } diff --git a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java index 0c9eb99ab75..a1a0c3e1f5f 100644 --- a/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java +++ b/components/camel-http/src/main/java/org/apache/camel/component/http/HttpProducer.java @@ -25,7 +25,6 @@ import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.Charset; -import java.time.Instant; import java.util.ArrayList; import java.util.Collections; import java.util.Date; @@ -145,7 +144,7 @@ public class HttpProducer extends DefaultProducer { boolean cookies = !getEndpoint().getComponent().isCookieManagementDisabled(); if (cookies && getEndpoint().isClearExpiredCookies() && !getEndpoint().isBridgeEndpoint()) { // create the cookies before the invocation - getEndpoint().getCookieStore().clearExpired(Instant.now()); + getEndpoint().getCookieStore().clearExpired(new Date()); } // if we bridge endpoint then we need to skip matching headers with the HTTP_QUERY to avoid sending diff --git a/docs/user-manual/modules/ROOT/pages/camel-4-migration-guide.adoc b/docs/user-manual/modules/ROOT/pages/camel-4-migration-guide.adoc index 856730757a4..47a500cda9d 100644 --- a/docs/user-manual/modules/ROOT/pages/camel-4-migration-guide.adoc +++ b/docs/user-manual/modules/ROOT/pages/camel-4-migration-guide.adoc @@ -156,14 +156,14 @@ The underlying `hapi-fhir` library has been upgraded from 4.2.0 to 6.2.4. Only t === camel-http -The component has been upgraded to use Apache HttpComponents v5 which has an impact on how the underlying client is configured. There are 5 different -timeouts (`connectionRequestTimeout`, `connectTimeout`, `socketTimeout`, `soTimeout` and `responseTimeout`) instead of initially 3 -(`connectionRequestTimeout`, `connectTimeout` and `socketTimeout`) and their default values have changed for some of them so please refer to the documentation +The component has been upgraded to use Apache HttpComponents v5 which has an impact on how the underlying client is configured. There are 4 different +timeouts (`connectionRequestTimeout`, `connectTimeout`, `soTimeout` and `responseTimeout`) instead of initially 3 +(`connectionRequestTimeout`, `connectTimeout` and `socketTimeout`) and the default value of some of them has changed so please refer to the documentation for more details. -There is also a noticeable behavior change regarding the `socketTimeout`, it is now needed to configure it with the option `soTimeout` to get the previous behavior. +Please note that the `socketTimeout` has been removed from the possible configuration parameters of `HttpClient`, . -Finally, the options `connectTimeout` and `socketTimeout` along with any parameters included into `SocketConfig` and `ConnectionConfig`, need to be prefixed by `httpConnection.`, +Finally, the option `soTimeout` along with any parameters included into `SocketConfig`, need to be prefixed by `httpConnection.`, the rest of the parameters including those defined into `HttpClientBuilder` and `RequestConfig` still need to be prefixed by `httpClient.` like before. === camel-http-common diff --git a/parent/pom.xml b/parent/pom.xml index b12ce0bfeca..ec5624d0f2e 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -212,7 +212,7 @@ <hsqldb-version>2.7.1</hsqldb-version> <httpunit-version>1.7</httpunit-version> <httpcore-version>5.2.1</httpcore-version> - <httpclient-version>5.2.1</httpclient-version> + <httpclient-version>5.1.4</httpclient-version> <httpcore4-version>4.4.16</httpcore4-version> <httpclient4-version>4.5.14</httpclient4-version> <httpasyncclient-version>4.1.5</httpasyncclient-version>
