This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 4a903e2b8f3c Align dependencies with Spring Boot 4.1.0 (#23924)
4a903e2b8f3c is described below

commit 4a903e2b8f3c10014ded822d6fe5e08a65f638f0
Author: Federico Mariani <[email protected]>
AuthorDate: Thu Jun 11 21:08:12 2026 +0200

    Align dependencies with Spring Boot 4.1.0 (#23924)
    
    * Align dependencies with Spring Boot 4.1.0
    
    Update spring-boot 4.0.6 -> 4.1.0 and align managed dependency
    versions with the Spring Boot 4.1.0 BOM:
    - spring-batch 6.0.3 -> 6.0.4
    - spring-data-redis 4.0.5 -> 4.1.0
    - spring-rabbitmq 4.0.3 -> 4.1.0
    - spring-vault-core 4.0.2 -> 4.1.0
    - netty 4.2.12 -> 4.2.15
    - httpclient5 5.5.2 -> 5.6.1
    - infinispan 16.0.13 -> 16.1.4
    - infinispan-protostream 6.0.2 -> 6.0.7
    - testcontainers 2.0.3 -> 2.0.5
    
    Migrate infinispan-commons-test to infinispan-testing as the artifact
    was removed in Infinispan 16.1.x.
    
    * CAMEL-23375: Fix double gzip decompression with httpclient 5.6+
    
    httpclient 5.6 no longer removes Content-Encoding headers after
    auto-decompression. Read encoding from entity.getContentEncoding()
    instead of the response header to avoid double-decompressing.
    
    * CAMEL-23375: Fix double gzip decompression with httpclient 5.6+
    
    httpclient 5.6 no longer removes Content-Encoding, Content-Length, and
    Content-MD5 headers after auto-decompression. Strip them from the
    response after executeMethod when the entity was auto-decompressed,
    restoring the 5.5.2 invariant for all downstream code.
    
    Also fix TLS hostname verification: httpclient 5.6 changed
    DefaultClientTlsStrategy to use BOTH policy, enabling the JDK built-in
    hostname check which runs before the custom verifier. Use
    ClientTlsStrategyBuilder with CLIENT policy so NoopHostnameVerifier
    actually disables verification.
---
 .../apache/camel/component/http/HttpComponent.java | 24 +++++++++++--------
 .../apache/camel/component/http/HttpProducer.java  | 25 +++++++++++++++++---
 .../http/LoggingHttpActivityListener.java          |  9 ++++----
 .../camel/component/http/HttpCompressionTest.java  | 27 ++++++++++++++++++++++
 .../camel-infinispan-embedded/pom.xml              |  2 +-
 .../InfinispanEmbeddedClusteredConsumerTest.java   |  2 +-
 .../camel-infinispan/camel-infinispan/pom.xml      |  2 +-
 .../ROOT/pages/camel-4x-upgrade-guide-4_21.adoc    | 24 +++++++++++++++++++
 parent/pom.xml                                     | 20 ++++++++--------
 9 files changed, 106 insertions(+), 29 deletions(-)

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 755f6e564672..fdaba0e6828c 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
@@ -24,6 +24,7 @@ import java.util.Map;
 import java.util.Optional;
 
 import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
@@ -62,8 +63,9 @@ import 
org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
 import 
org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
 import org.apache.hc.client5.http.io.HttpClientConnectionManager;
-import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy;
+import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder;
 import org.apache.hc.client5.http.ssl.DefaultHostnameVerifier;
+import org.apache.hc.client5.http.ssl.HostnameVerificationPolicy;
 import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
 import org.apache.hc.core5.http.io.SocketConfig;
 import org.apache.hc.core5.http.protocol.HttpContext;
@@ -604,14 +606,18 @@ public class HttpComponent extends HttpCommonComponent 
implements RestProducerFa
             HostnameVerifier x509HostnameVerifier,
             SSLContextParameters sslContextParams, boolean useSystemProperties)
             throws GeneralSecurityException, IOException {
-        // create the TLS strategy to use
-        if (sslContextParams != null) {
-            return new 
DefaultClientTlsStrategy(sslContextParams.createSSLContext(getCamelContext()), 
x509HostnameVerifier);
-        } else {
-            return new DefaultClientTlsStrategy(
-                    useSystemProperties ? SSLContexts.createSystemDefault() : 
SSLContexts.createDefault(),
-                    x509HostnameVerifier);
-        }
+        SSLContext sslContext = sslContextParams != null
+                ? sslContextParams.createSSLContext(getCamelContext())
+                : (useSystemProperties ? SSLContexts.createSystemDefault() : 
SSLContexts.createDefault());
+        // httpclient 5.6 changed DefaultClientTlsStrategy to use BOTH policy 
by default,
+        // which enables the JDK built-in hostname check via SSLParameters in 
addition to the
+        // custom verifier. Use CLIENT so only the configured verifier decides 
— this restores
+        // the 5.5.2 behavior where NoopHostnameVerifier actually disables 
verification.
+        return ClientTlsStrategyBuilder.create()
+                .setSslContext(sslContext)
+                .setHostnameVerifier(x509HostnameVerifier)
+                .setHostVerificationPolicy(HostnameVerificationPolicy.CLIENT)
+                .buildClassic();
     }
 
     protected HttpClientConnectionManager createConnectionManager(
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 8931a5607fa3..251f8ba23275 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
@@ -71,6 +71,7 @@ import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HeaderElements;
 import org.apache.hc.core5.http.HttpEntity;
 import org.apache.hc.core5.http.HttpException;
+import org.apache.hc.core5.http.HttpHeaders;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.HttpVersion;
 import org.apache.hc.core5.http.io.HttpClientResponseHandler;
@@ -259,6 +260,10 @@ public class HttpProducer extends DefaultProducer 
implements LineNumberAware {
                             if (LOG.isDebugEnabled()) {
                                 LOG.debug("Http responseCode: {}", 
responseCode);
                             }
+                            // httpclient 5.6+ auto-decompresses but no longer 
removes the stale
+                            // Content-Encoding, Content-Length, and 
Content-MD5 headers.
+                            // Strip them here to restore the 5.5.2 invariant 
for all downstream code.
+                            removeStaleCompressionHeaders(httpResponse);
                             if (!throwException) {
                                 // if we do not use failed exception then 
populate response for all response codes
                                 HttpProducer.this.populateResponse(exchange, 
httpRequest, httpResponse, strategy, responseCode);
@@ -512,6 +517,21 @@ public class HttpProducer extends DefaultProducer 
implements LineNumberAware {
         return answer;
     }
 
+    /**
+     * httpclient 5.6+ auto-decompresses response bodies but no longer strips 
the stale Content-Encoding, Content-Length
+     * (compressed byte count), and Content-MD5 headers. Remove them here so 
every downstream reader sees the same
+     * invariant as 5.5.2.
+     */
+    private static void removeStaleCompressionHeaders(ClassicHttpResponse 
httpResponse) {
+        HttpEntity entity = httpResponse.getEntity();
+        if (entity != null && entity.getContentEncoding() == null
+                && httpResponse.containsHeader(Exchange.CONTENT_ENCODING)) {
+            httpResponse.removeHeaders(Exchange.CONTENT_ENCODING);
+            httpResponse.removeHeaders(Exchange.CONTENT_LENGTH);
+            httpResponse.removeHeaders(HttpHeaders.CONTENT_MD5);
+        }
+    }
+
     /**
      * Extracts the response from the method as a InputStream.
      */
@@ -528,8 +548,7 @@ public class HttpProducer extends DefaultProducer 
implements LineNumberAware {
             return null;
         }
 
-        Header header = 
httpResponse.getFirstHeader(HttpConstants.CONTENT_ENCODING);
-        String contentEncoding = header != null ? header.getValue() : null;
+        String contentEncoding = entity.getContentEncoding();
 
         final boolean gzipEncoding = 
exchange.getProperty(Exchange.SKIP_GZIP_ENCODING, Boolean.FALSE, Boolean.class);
         if (!gzipEncoding) {
@@ -537,7 +556,7 @@ public class HttpProducer extends DefaultProducer 
implements LineNumberAware {
         }
         // Honor the character encoding
         String contentType = null;
-        header = httpResponse.getFirstHeader("content-type");
+        Header header = httpResponse.getFirstHeader("content-type");
         if (header != null) {
             contentType = header.getValue();
             // find the charset and set it to the Exchange
diff --git 
a/components/camel-http/src/main/java/org/apache/camel/component/http/LoggingHttpActivityListener.java
 
b/components/camel-http/src/main/java/org/apache/camel/component/http/LoggingHttpActivityListener.java
index 49cb945d92de..22a5645b3477 100644
--- 
a/components/camel-http/src/main/java/org/apache/camel/component/http/LoggingHttpActivityListener.java
+++ 
b/components/camel-http/src/main/java/org/apache/camel/component/http/LoggingHttpActivityListener.java
@@ -180,15 +180,16 @@ public class LoggingHttpActivityListener extends 
ServiceSupport implements Camel
                         if (!accepted) {
                             lines.add("WARN: Cannot log HTTP body because the 
body is binary");
                         } else {
-                            Header ce = request != null
+                            Header reqCe = request != null
                                     ? 
request.getHeader(HttpHeaders.CONTENT_ENCODING)
-                                    : 
response.getHeader(HttpHeaders.CONTENT_ENCODING);
+                                    : null;
+                            String ce = reqCe != null ? reqCe.getValue() : 
e.getContentEncoding();
                             ByteArrayOutputStream bos = new 
ByteArrayOutputStream();
                             e.writeTo(bos);
                             String data;
-                            if (ce != null && 
GZIPHelper.isGzip(ce.getValue())) {
+                            if (ce != null && GZIPHelper.isGzip(ce)) {
                                 ByteArrayInputStream bis = new 
ByteArrayInputStream(bos.toByteArray());
-                                InputStream is = 
GZIPHelper.uncompressGzip(ce.getValue(), bis);
+                                InputStream is = GZIPHelper.uncompressGzip(ce, 
bis);
                                 data = new String(is.readAllBytes());
                                 IOHelper.close(is);
                             } else {
diff --git 
a/components/camel-http/src/test/java/org/apache/camel/component/http/HttpCompressionTest.java
 
b/components/camel-http/src/test/java/org/apache/camel/component/http/HttpCompressionTest.java
index 85906a00a973..697861ab9d1d 100644
--- 
a/components/camel-http/src/test/java/org/apache/camel/component/http/HttpCompressionTest.java
+++ 
b/components/camel-http/src/test/java/org/apache/camel/component/http/HttpCompressionTest.java
@@ -105,6 +105,33 @@ public class HttpCompressionTest extends BaseHttpTest {
         assertBody(out.getBody(String.class));
     }
 
+    @Test
+    public void compressedHttpPostWithAutoDecompressionDisabled() {
+        HttpComponent http = context.getComponent("http", HttpComponent.class);
+        http.setContentCompressionDisabled(true);
+        try {
+            Exchange exchange = template.request(
+                    "http://localhost:"; + localServer.getLocalPort() + "/",
+                    exchange1 -> {
+                        exchange1.getIn().setHeader(Exchange.CONTENT_TYPE, 
"text/plain");
+                        exchange1.getIn().setHeader(Exchange.CONTENT_ENCODING, 
"gzip");
+                        exchange1.getIn().setBody(getBody());
+                    });
+
+            assertNotNull(exchange);
+
+            Message out = exchange.getMessage();
+            assertNotNull(out);
+
+            Map<String, Object> headers = out.getHeaders();
+            assertEquals(HttpStatus.SC_OK, 
headers.get(Exchange.HTTP_RESPONSE_CODE));
+
+            assertBody(out.getBody(String.class));
+        } finally {
+            http.setContentCompressionDisabled(false);
+        }
+    }
+
     @Override
     protected HttpProcessor getBasicHttpProcessor() {
         List<HttpRequestInterceptor> requestInterceptors = new ArrayList<>();
diff --git a/components/camel-infinispan/camel-infinispan-embedded/pom.xml 
b/components/camel-infinispan/camel-infinispan-embedded/pom.xml
index efa68932742b..46de724d3053 100644
--- a/components/camel-infinispan/camel-infinispan-embedded/pom.xml
+++ b/components/camel-infinispan/camel-infinispan-embedded/pom.xml
@@ -99,7 +99,7 @@
         </dependency>
         <dependency>
             <groupId>org.infinispan</groupId>
-            <artifactId>infinispan-commons-test</artifactId>
+            <artifactId>infinispan-testing</artifactId>
             <version>${infinispan-version}</version>
             <scope>test</scope>
         </dependency>
diff --git 
a/components/camel-infinispan/camel-infinispan-embedded/src/test/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedClusteredConsumerTest.java
 
b/components/camel-infinispan/camel-infinispan-embedded/src/test/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedClusteredConsumerTest.java
index 97b3deb5face..4312b513000b 100644
--- 
a/components/camel-infinispan/camel-infinispan-embedded/src/test/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedClusteredConsumerTest.java
+++ 
b/components/camel-infinispan/camel-infinispan-embedded/src/test/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedClusteredConsumerTest.java
@@ -21,8 +21,8 @@ import java.util.concurrent.TimeUnit;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.infinispan.InfinispanConstants;
 import org.apache.camel.component.mock.MockEndpoint;
-import org.infinispan.commons.test.TestResourceTracker;
 import org.infinispan.distribution.MagicKey;
+import org.infinispan.testing.TestResourceTracker;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
diff --git a/components/camel-infinispan/camel-infinispan/pom.xml 
b/components/camel-infinispan/camel-infinispan/pom.xml
index 3cedc7d86e37..fbbf79b81853 100644
--- a/components/camel-infinispan/camel-infinispan/pom.xml
+++ b/components/camel-infinispan/camel-infinispan/pom.xml
@@ -109,7 +109,7 @@
         </dependency>
         <dependency>
             <groupId>org.infinispan</groupId>
-            <artifactId>infinispan-commons-test</artifactId>
+            <artifactId>infinispan-testing</artifactId>
             <version>${infinispan-version}</version>
             <scope>test</scope>
         </dependency>
diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_21.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_21.adoc
index 5e94871f03fe..58ab635be92f 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_21.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_21.adoc
@@ -2205,3 +2205,27 @@ is migrated to JSON the next time the metadata is 
updated.
 
 Because older versions cannot read the new JSON metadata, downgrading after 
new key metadata has been
 written is not supported.
+
+=== camel-http
+
+The `camel-http` component now requires Apache HttpClient 5.5 or later 
(previously 5.4+). The
+`ClientTlsStrategyBuilder.buildClassic()` and `setHostVerificationPolicy()` 
APIs used internally
+were introduced in HttpClient 5.5. Overriding the `httpclient5` version to 
5.4.x or earlier will
+produce `NoSuchMethodError` at runtime.
+
+==== TLS hostname verification policy
+
+`camel-http` now explicitly uses `HostnameVerificationPolicy.CLIENT` when 
constructing the TLS
+strategy. This means only the configured `x509HostnameVerifier` (defaulting to
+`DefaultHostnameVerifier`) decides whether a certificate matches the target 
hostname. The JDK's
+built-in endpoint-identification check via 
`SSLParameters.setEndpointIdentificationAlgorithm("https")`
+is not applied.
+
+This restores the behavior from HttpClient 5.5.2, where `NoopHostnameVerifier` 
actually disabled
+hostname verification. HttpClient 5.6 changed the default to 
`HostnameVerificationPolicy.BOTH`,
+which enables the JDK check alongside the custom verifier — making 
`NoopHostnameVerifier` ineffective
+because the JDK check runs first and rejects mismatched certificates.
+
+The `CLIENT` policy is a deliberate choice: it preserves backward 
compatibility and allows
+`NoopHostnameVerifier` to work as documented. A future release may add an 
option to opt into the
+`BOTH` policy for defense-in-depth.
diff --git a/parent/pom.xml b/parent/pom.xml
index 48bff6668bd8..afc2b8b4f683 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -228,7 +228,7 @@
         <mariadb-version>3.5.8</mariadb-version>
         <mariadb4j-version>3.3.1</mariadb4j-version>
         <httpcore-version>5.4.2</httpcore-version>
-        <httpclient-version>5.5.2</httpclient-version>
+        <httpclient-version>5.6.1</httpclient-version>
         <httpcore4-version>4.4.16</httpcore4-version>
         <httpclient4-version>4.5.14</httpclient4-version>
         <httpasyncclient-version>4.1.5</httpasyncclient-version>
@@ -244,8 +244,8 @@
         <iggy-version>0.8.0</iggy-version>
         <ignite-version>2.18.0</ignite-version>
         <impsort-maven-plugin-version>1.13.0</impsort-maven-plugin-version>
-        <infinispan-version>16.0.13</infinispan-version>
-        <infinispan-protostream-version>6.0.2</infinispan-protostream-version>
+        <infinispan-version>16.1.4</infinispan-version>
+        <infinispan-protostream-version>6.0.7</infinispan-protostream-version>
         <influx-java-driver-version>2.25</influx-java-driver-version>
         
<influx-client-java-driver-version>8.0.0</influx-client-java-driver-version>
         <irclib-version>1.10</irclib-version>
@@ -396,7 +396,7 @@
         <narayana-version>7.3.4.Final</narayana-version>
         <neoscada-version>0.4.0</neoscada-version>
         <neo4j-version>6.1.0</neo4j-version>
-        <netty-version>4.2.12.Final</netty-version>
+        <netty-version>4.2.15.Final</netty-version>
         
<networknt-json-schema-validator-version>2.0.1</networknt-json-schema-validator-version>
         <nimbus-jose-jwt>10.9.1</nimbus-jose-jwt>
         <olingo2-version>2.0.13</olingo2-version>
@@ -483,13 +483,13 @@
         <spock-version>2.4-groovy-5.0</spock-version>
         <spring-ai-version>1.1.7</spring-ai-version>
         <spring-cloud-config-version>5.0.3</spring-cloud-config-version>
-        <spring-batch-version>6.0.3</spring-batch-version>
-        <spring-boot-version>4.0.6</spring-boot-version>
-        <spring-data-redis-version>4.0.5</spring-data-redis-version>
+        <spring-batch-version>6.0.4</spring-batch-version>
+        <spring-boot-version>4.1.0</spring-boot-version>
+        <spring-data-redis-version>4.1.0</spring-data-redis-version>
         <spring-ldap-version>4.1.0</spring-ldap-version>
-        <spring-vault-core-version>4.0.2</spring-vault-core-version>
+        <spring-vault-core-version>4.1.0</spring-vault-core-version>
         <spring-version>7.0.8</spring-version>
-        <spring-rabbitmq-version>4.0.3</spring-rabbitmq-version>
+        <spring-rabbitmq-version>4.1.0</spring-rabbitmq-version>
         <spring-security-version>7.1.0</spring-security-version>
         <spring-ws-version>5.0.2</spring-ws-version>
         <sql-maven-plugin-version>3.0.0</sql-maven-plugin-version>
@@ -506,7 +506,7 @@
         <stringtemplate-version>4.3.4</stringtemplate-version>
         <tahu-version>1.0.19</tahu-version>
         <tamboui-version>0.3.0</tamboui-version>
-        <testcontainers-version>2.0.3</testcontainers-version>
+        <testcontainers-version>2.0.5</testcontainers-version>
         <thymeleaf-version>3.1.5.RELEASE</thymeleaf-version>
         <tika-version>3.3.1</tika-version>
         <twilio-version>12.1.1</twilio-version>

Reply via email to