You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2024/01/26 09:19:42 UTC
(httpcomponents-client) 03/04: Deprecated ConnectionSocketFactory, LayeredConnectionSocketFactory and their plain and SSL implementations in favor of DefaultClientTlsStrategy
This is an automated email from the ASF dual-hosted git repository.
olegk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git
commit 9d75647eca3c41a8da2475cd65e2521431a9f9b1
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Mon Jan 22 09:33:59 2024 +0100
Deprecated ConnectionSocketFactory, LayeredConnectionSocketFactory and their plain and SSL implementations in favor of DefaultClientTlsStrategy
---
.../CachingHttpClientCompatibilityTest.java | 4 +-
.../external/HttpClientCompatibilityTest.java | 4 +-
...tory.java => TestDefaultClientTlsStrategy.java} | 164 ++++++++-------------
.../sync/extension/TestClientResources.java | 6 +-
.../http/impl/async/H2AsyncClientBuilder.java | 4 +-
.../client5/http/impl/async/HttpAsyncClients.java | 2 +-
.../impl/io/BasicHttpClientConnectionManager.java | 85 ++++++++---
.../io/DefaultHttpClientConnectionOperator.java | 71 +++++----
.../io/PoolingHttpClientConnectionManager.java | 53 +++++--
.../PoolingHttpClientConnectionManagerBuilder.java | 46 +++---
.../nio/PoolingAsyncClientConnectionManager.java | 2 +-
...PoolingAsyncClientConnectionManagerBuilder.java | 4 +-
.../http/socket/ConnectionSocketFactory.java | 3 +-
.../socket/LayeredConnectionSocketFactory.java | 3 +-
.../http/socket/PlainConnectionSocketFactory.java | 7 +-
.../client5/http/ssl/DefaultClientTlsStrategy.java | 26 +++-
.../http/ssl/SSLConnectionSocketFactory.java | 6 +-
.../ssl/SSLConnectionSocketFactoryBuilder.java | 3 +-
.../client5/http/examples/ClientConfiguration.java | 7 +-
.../examples/ClientCustomPublicSuffixList.java | 7 +-
.../hc/client5/http/examples/ClientCustomSSL.java | 10 +-
.../io/TestBasicHttpClientConnectionManager.java | 27 ++--
.../impl/io/TestHttpClientConnectionOperator.java | 34 +++--
.../io/TestPoolingHttpClientConnectionManager.java | 28 ++--
.../hc/client5/http/ssl/TestSSLSocketFactory.java | 77 ----------
25 files changed, 349 insertions(+), 334 deletions(-)
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/external/CachingHttpClientCompatibilityTest.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/external/CachingHttpClientCompatibilityTest.java
index 2c0eba70e..59a7e8af8 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/external/CachingHttpClientCompatibilityTest.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/external/CachingHttpClientCompatibilityTest.java
@@ -40,7 +40,7 @@ import org.apache.hc.client5.http.impl.cache.HeapResourceFactory;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
+import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.HttpHeaders;
import org.apache.hc.core5.http.HttpHost;
@@ -76,7 +76,7 @@ public class CachingHttpClientCompatibilityTest {
final SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(getClass().getResource("/test-ca.keystore"), "nopassword".toCharArray()).build();
this.connManager = PoolingHttpClientConnectionManagerBuilder.create()
- .setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext))
+ .setTlsSocketStrategy(new DefaultClientTlsStrategy(sslContext))
.build();
this.client = CachingHttpClients.custom()
.setCacheConfig(CacheConfig.custom()
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/external/HttpClientCompatibilityTest.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/external/HttpClientCompatibilityTest.java
index d8fd4f760..bd8c7f4a6 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/external/HttpClientCompatibilityTest.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/external/HttpClientCompatibilityTest.java
@@ -42,7 +42,7 @@ import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
import org.apache.hc.client5.http.protocol.HttpClientContext;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
+import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.HeaderElements;
import org.apache.hc.core5.http.HttpHeaders;
@@ -102,7 +102,7 @@ public class HttpClientCompatibilityTest {
final SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(getClass().getResource("/test-ca.keystore"), "nopassword".toCharArray()).build();
this.connManager = PoolingHttpClientConnectionManagerBuilder.create()
- .setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext))
+ .setTlsSocketStrategy(new DefaultClientTlsStrategy(sslContext))
.build();
this.client = HttpClients.custom()
.setConnectionManager(this.connManager)
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestSSLSocketFactory.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestDefaultClientTlsStrategy.java
similarity index 60%
rename from httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestSSLSocketFactory.java
rename to httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestDefaultClientTlsStrategy.java
index 0a83b6ab5..01d80a275 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestSSLSocketFactory.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestDefaultClientTlsStrategy.java
@@ -30,12 +30,10 @@ package org.apache.hc.client5.testing.sync;
import static org.hamcrest.MatcherAssert.assertThat;
import java.io.IOException;
-import java.net.InetSocketAddress;
import java.net.Socket;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
-import java.util.concurrent.atomic.AtomicBoolean;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
@@ -43,9 +41,9 @@ import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
+import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy;
import org.apache.hc.client5.http.ssl.NoopHostnameVerifier;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder;
+import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
import org.apache.hc.client5.testing.SSLTestContexts;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.impl.bootstrap.HttpServer;
@@ -55,17 +53,15 @@ import org.apache.hc.core5.http.protocol.HttpContext;
import org.apache.hc.core5.io.CloseMode;
import org.apache.hc.core5.ssl.SSLContexts;
import org.apache.hc.core5.ssl.TrustStrategy;
-import org.apache.hc.core5.util.TimeValue;
-import org.apache.hc.core5.util.Timeout;
import org.hamcrest.CoreMatchers;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
/**
- * Unit tests for {@link SSLConnectionSocketFactory}.
+ * Unit tests for {@link DefaultClientTlsStrategy}.
*/
-public class TestSSLSocketFactory {
+public class TestDefaultClientTlsStrategy {
private HttpServer server;
@@ -103,16 +99,14 @@ public class TestSSLSocketFactory {
final HttpContext context = new BasicHttpContext();
final TestX509HostnameVerifier hostVerifier = new TestX509HostnameVerifier();
- final SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
+ final TlsSocketStrategy tlsStrategy = new DefaultClientTlsStrategy(
SSLTestContexts.createClientSSLContext(), hostVerifier);
- try (final Socket socket = socketFactory.createSocket(context)) {
- final InetSocketAddress remoteAddress = new InetSocketAddress("localhost", this.server.getLocalPort());
- final HttpHost target = new HttpHost("https", "localhost", this.server.getLocalPort());
- try (final SSLSocket sslSocket = (SSLSocket) socketFactory.connectSocket(
- TimeValue.ZERO_MILLISECONDS,
+ final HttpHost target = new HttpHost("https", "localhost", server.getLocalPort());
+ try (final Socket socket = new Socket(target.getHostName(), target.getPort())) {
+ try (final SSLSocket sslSocket = tlsStrategy.upgrade(
socket,
- target,
- remoteAddress,
+ target.getHostName(),
+ target.getPort(),
null,
context)) {
final SSLSession sslsession = sslSocket.getSession();
@@ -123,44 +117,6 @@ public class TestSSLSocketFactory {
}
}
- @Test
- public void testBasicSslConnectOverride() throws Exception {
- this.server = ServerBootstrap.bootstrap()
- .setSslContext(SSLTestContexts.createServerSSLContext())
- .create();
- this.server.start();
-
- final HttpContext context = new BasicHttpContext();
- final AtomicBoolean connectCalled = new AtomicBoolean();
- final SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
- SSLTestContexts.createClientSSLContext()) {
- @Override
- protected void connectSocket(
- final Socket sock,
- final InetSocketAddress remoteAddress,
- final Timeout connectTimeout,
- final HttpContext context) throws IOException {
- connectCalled.set(true);
- super.connectSocket(sock, remoteAddress, connectTimeout, context);
- }
- };
- try (final Socket socket = socketFactory.createSocket(context)) {
- final InetSocketAddress remoteAddress = new InetSocketAddress("localhost", this.server.getLocalPort());
- final HttpHost target = new HttpHost("https", "localhost", this.server.getLocalPort());
- try (final SSLSocket sslSocket = (SSLSocket) socketFactory.connectSocket(
- TimeValue.ZERO_MILLISECONDS,
- socket,
- target,
- remoteAddress,
- null,
- context)) {
- final SSLSession sslsession = sslSocket.getSession();
- Assertions.assertNotNull(sslsession);
- Assertions.assertTrue(connectCalled.get());
- }
- }
- }
-
@Test
public void testBasicDefaultHostnameVerifier() throws Exception {
// @formatter:off
@@ -171,17 +127,13 @@ public class TestSSLSocketFactory {
this.server.start();
final HttpContext context = new BasicHttpContext();
- final SSLConnectionSocketFactory socketFactory = SSLConnectionSocketFactoryBuilder.create()
- .setSslContext(SSLTestContexts.createClientSSLContext())
- .build();
- try (final Socket socket = socketFactory.createSocket(context)) {
- final InetSocketAddress remoteAddress = new InetSocketAddress("localhost", this.server.getLocalPort());
- final HttpHost target = new HttpHost("https", "localhost", this.server.getLocalPort());
- try (final SSLSocket sslSocket = (SSLSocket) socketFactory.connectSocket(
- TimeValue.ZERO_MILLISECONDS,
+ final TlsSocketStrategy tlsStrategy = new DefaultClientTlsStrategy(SSLTestContexts.createClientSSLContext());
+ final HttpHost target = new HttpHost("https", "localhost", server.getLocalPort());
+ try (final Socket socket = new Socket(target.getHostName(), target.getPort())) {
+ try (final SSLSocket sslSocket = tlsStrategy.upgrade(
socket,
- target,
- remoteAddress,
+ target.getHostName(),
+ target.getPort(),
null,
context)) {
final SSLSession sslsession = sslSocket.getSession();
@@ -202,16 +154,14 @@ public class TestSSLSocketFactory {
final HttpContext context = new BasicHttpContext();
final TestX509HostnameVerifier hostVerifier = new TestX509HostnameVerifier();
- final SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
+ final TlsSocketStrategy tlsStrategy = new DefaultClientTlsStrategy(
SSLTestContexts.createClientSSLContext(), hostVerifier);
- try (final Socket socket = socketFactory.createSocket(context)) {
- final InetSocketAddress remoteAddress = new InetSocketAddress("localhost", this.server.getLocalPort());
- final HttpHost target = new HttpHost("https", "localhost", this.server.getLocalPort());
- try (final SSLSocket sslSocket = (SSLSocket) socketFactory.connectSocket(
- TimeValue.ZERO_MILLISECONDS,
+ final HttpHost target = new HttpHost("https", "localhost", server.getLocalPort());
+ try (final Socket socket = new Socket(target.getHostName(), target.getPort())) {
+ try (final SSLSocket sslSocket = tlsStrategy.upgrade(
socket,
- target,
- remoteAddress,
+ target.getHostName(),
+ target.getPort(),
null,
context)) {
final SSLSession sslsession = sslSocket.getSession();
@@ -234,16 +184,15 @@ public class TestSSLSocketFactory {
final HttpContext context = new BasicHttpContext();
final TestX509HostnameVerifier hostVerifier = new TestX509HostnameVerifier();
- final SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
+ final TlsSocketStrategy tlsStrategy = new DefaultClientTlsStrategy(
SSLTestContexts.createClientSSLContext(), hostVerifier);
- try (final Socket socket = socketFactory.createSocket(context)) {
- final InetSocketAddress remoteAddress = new InetSocketAddress("localhost", this.server.getLocalPort());
- final HttpHost target = new HttpHost("https", "localhost", this.server.getLocalPort());
+ final HttpHost target = new HttpHost("https", "localhost", server.getLocalPort());
+ try (final Socket socket = new Socket(target.getHostName(), target.getPort())) {
Assertions.assertThrows(IOException.class, () -> {
- try (final SSLSocket sslSocket = (SSLSocket) socketFactory.connectSocket(
- TimeValue.ZERO_MILLISECONDS,
- socket, target,
- remoteAddress,
+ try (final SSLSocket sslSocket = tlsStrategy.upgrade(
+ socket,
+ target.getHostName(),
+ target.getPort(),
null,
context)) {
final SSLSession sslsession = sslSocket.getSession();
@@ -269,15 +218,14 @@ public class TestSSLSocketFactory {
// Use default SSL context
final SSLContext defaultSslContext = SSLContexts.createDefault();
- final SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(defaultSslContext,
+ final TlsSocketStrategy tlsStrategy = new DefaultClientTlsStrategy(defaultSslContext,
NoopHostnameVerifier.INSTANCE);
- try (final Socket socket = socketFactory.createSocket(context)) {
- final InetSocketAddress remoteAddress = new InetSocketAddress("localhost", this.server.getLocalPort());
- final HttpHost target = new HttpHost("https", "localhost", this.server.getLocalPort());
+ final HttpHost target = new HttpHost("https", "localhost", server.getLocalPort());
+ try (final Socket socket = new Socket(target.getHostName(), target.getPort())) {
Assertions.assertThrows(SSLException.class, () -> {
- try (final SSLSocket sslSocket = (SSLSocket) socketFactory.connectSocket(
- TimeValue.ZERO_MILLISECONDS, socket, target, remoteAddress, null, context)) {
+ try (final SSLSocket sslSocket = tlsStrategy.upgrade(
+ socket, target.getHostName(), target.getPort(), null, context)) {
// empty for now
}
});
@@ -306,14 +254,17 @@ public class TestSSLSocketFactory {
.loadTrustMaterial(null, trustStrategy)
.build();
// @formatter:on
- final SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext,
+ final TlsSocketStrategy tlsStrategy = new DefaultClientTlsStrategy(sslContext,
NoopHostnameVerifier.INSTANCE);
- try (final Socket socket = socketFactory.createSocket(context)) {
- final InetSocketAddress remoteAddress = new InetSocketAddress("localhost", this.server.getLocalPort());
- final HttpHost target = new HttpHost("https", "localhost", this.server.getLocalPort());
- try (final SSLSocket sslSocket = (SSLSocket) socketFactory.connectSocket(TimeValue.ZERO_MILLISECONDS, socket, target, remoteAddress,
- null, context)) {
+ final HttpHost target = new HttpHost("https", "localhost", server.getLocalPort());
+ try (final Socket socket = new Socket(target.getHostName(), target.getPort())) {
+ try (final SSLSocket sslSocket = tlsStrategy.upgrade(
+ socket,
+ target.getHostName(),
+ target.getPort(),
+ null,
+ context)) {
// empty for now
}
}
@@ -330,14 +281,17 @@ public class TestSSLSocketFactory {
this.server.start();
final HttpContext context = new BasicHttpContext();
- final SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
+ final TlsSocketStrategy tlsStrategy = new DefaultClientTlsStrategy(
SSLTestContexts.createClientSSLContext());
- try (final Socket socket = socketFactory.createSocket(context)) {
- final InetSocketAddress remoteAddress = new InetSocketAddress("localhost", this.server.getLocalPort());
- final HttpHost target = new HttpHost("https", "localhost", this.server.getLocalPort());
+ final HttpHost target = new HttpHost("https", "localhost", server.getLocalPort());
+ try (final Socket socket = new Socket(target.getHostName(), target.getPort())) {
Assertions.assertThrows(IOException.class, () ->
- socketFactory.connectSocket(
- TimeValue.ZERO_MILLISECONDS, socket, target, remoteAddress, null, context));
+ tlsStrategy.upgrade(
+ socket,
+ target.getHostName(),
+ target.getPort(),
+ null,
+ context));
}
}
@@ -379,12 +333,16 @@ public class TestSSLSocketFactory {
this.server.start();
final HttpContext context = new BasicHttpContext();
- final SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
+ final TlsSocketStrategy tlsStrategy = new DefaultClientTlsStrategy(
SSLTestContexts.createClientSSLContext());
- try (final Socket socket = socketFactory.createSocket(context)) {
- final InetSocketAddress remoteAddress = new InetSocketAddress("localhost", this.server.getLocalPort());
- final HttpHost target = new HttpHost("https", "localhost", this.server.getLocalPort());
- socketFactory.connectSocket(TimeValue.ZERO_MILLISECONDS, socket, target, remoteAddress, null, context);
+ final HttpHost target = new HttpHost("https", "localhost", server.getLocalPort());
+ try (final Socket socket = new Socket(target.getHostName(), target.getPort())) {
+ tlsStrategy.upgrade(
+ socket,
+ target.getHostName(),
+ target.getPort(),
+ null,
+ context);
}
}
}
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/extension/TestClientResources.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/extension/TestClientResources.java
index fd79bed3e..fd8f0000a 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/extension/TestClientResources.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/extension/TestClientResources.java
@@ -37,7 +37,7 @@ import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.classic.MinimalHttpClient;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
+import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy;
import org.apache.hc.client5.testing.SSLTestContexts;
import org.apache.hc.core5.function.Decorator;
import org.apache.hc.core5.http.HttpHost;
@@ -124,7 +124,7 @@ public class TestClientResources implements BeforeEachCallback, AfterEachCallbac
Assertions.assertNull(client);
final PoolingHttpClientConnectionManagerBuilder connManagerBuilder = PoolingHttpClientConnectionManagerBuilder.create();
- connManagerBuilder.setSSLSocketFactory(new SSLConnectionSocketFactory(SSLTestContexts.createClientSSLContext()));
+ connManagerBuilder.setTlsSocketStrategy(new DefaultClientTlsStrategy(SSLTestContexts.createClientSSLContext()));
connManagerBuilder.setDefaultSocketConfig(SocketConfig.custom()
.setSoTimeout(timeout)
.build());
@@ -147,7 +147,7 @@ public class TestClientResources implements BeforeEachCallback, AfterEachCallbac
Assertions.assertNull(client);
final PoolingHttpClientConnectionManagerBuilder connManagerBuilder = PoolingHttpClientConnectionManagerBuilder.create();
- connManagerBuilder.setSSLSocketFactory(new SSLConnectionSocketFactory(SSLTestContexts.createClientSSLContext()));
+ connManagerBuilder.setTlsSocketStrategy(new DefaultClientTlsStrategy(SSLTestContexts.createClientSSLContext()));
connManagerBuilder.setDefaultSocketConfig(SocketConfig.custom()
.setSoTimeout(timeout)
.build());
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/H2AsyncClientBuilder.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/H2AsyncClientBuilder.java
index 5b0e7e956..56f2265d2 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/H2AsyncClientBuilder.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/H2AsyncClientBuilder.java
@@ -843,9 +843,9 @@ public class H2AsyncClientBuilder {
TlsStrategy tlsStrategyCopy = this.tlsStrategy;
if (tlsStrategyCopy == null) {
if (systemProperties) {
- tlsStrategyCopy = DefaultClientTlsStrategy.getSystemDefault();
+ tlsStrategyCopy = DefaultClientTlsStrategy.createSystemDefault();
} else {
- tlsStrategyCopy = DefaultClientTlsStrategy.getDefault();
+ tlsStrategyCopy = DefaultClientTlsStrategy.createDefault();
}
}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncClients.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncClients.java
index cfe292dd1..84b7b5536 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncClients.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncClients.java
@@ -314,7 +314,7 @@ public final class HttpAsyncClients {
public static MinimalH2AsyncClient createHttp2Minimal(
final H2Config h2Config,
final IOReactorConfig ioReactorConfig) {
- return createHttp2Minimal(h2Config, ioReactorConfig, DefaultClientTlsStrategy.getDefault());
+ return createHttp2Minimal(h2Config, ioReactorConfig, DefaultClientTlsStrategy.createDefault());
}
/**
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/BasicHttpClientConnectionManager.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/BasicHttpClientConnectionManager.java
index c2adfb767..52155a429 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/BasicHttpClientConnectionManager.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/BasicHttpClientConnectionManager.java
@@ -49,9 +49,8 @@ import org.apache.hc.client5.http.io.HttpClientConnectionManager;
import org.apache.hc.client5.http.io.HttpClientConnectionOperator;
import org.apache.hc.client5.http.io.LeaseRequest;
import org.apache.hc.client5.http.io.ManagedHttpClientConnection;
-import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
-import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
+import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy;
+import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
import org.apache.hc.core5.annotation.Contract;
import org.apache.hc.core5.annotation.ThreadingBehavior;
import org.apache.hc.core5.http.ClassicHttpRequest;
@@ -60,7 +59,6 @@ import org.apache.hc.core5.http.HttpException;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.URIScheme;
import org.apache.hc.core5.http.config.Lookup;
-import org.apache.hc.core5.http.config.Registry;
import org.apache.hc.core5.http.config.RegistryBuilder;
import org.apache.hc.core5.http.impl.io.HttpRequestExecutor;
import org.apache.hc.core5.http.io.HttpConnectionFactory;
@@ -119,22 +117,6 @@ public class BasicHttpClientConnectionManager implements HttpClientConnectionMan
private final AtomicBoolean closed;
- private static Registry<ConnectionSocketFactory> getDefaultRegistry() {
- return RegistryBuilder.<ConnectionSocketFactory>create()
- .register(URIScheme.HTTP.id, PlainConnectionSocketFactory.getSocketFactory())
- .register(URIScheme.HTTPS.id, SSLConnectionSocketFactory.getSocketFactory())
- .build();
- }
-
- public BasicHttpClientConnectionManager(
- final Lookup<ConnectionSocketFactory> socketFactoryRegistry,
- final HttpConnectionFactory<ManagedHttpClientConnection> connFactory,
- final SchemePortResolver schemePortResolver,
- final DnsResolver dnsResolver) {
- this(new DefaultHttpClientConnectionOperator(
- socketFactoryRegistry, schemePortResolver, dnsResolver), connFactory);
- }
-
/**
* @since 4.4
*/
@@ -153,19 +135,76 @@ public class BasicHttpClientConnectionManager implements HttpClientConnectionMan
this.lock = new ReentrantLock();
}
+ /**
+ * @since 5.4
+ */
+ public static BasicHttpClientConnectionManager create(
+ final SchemePortResolver schemePortResolver,
+ final DnsResolver dnsResolver,
+ final Lookup<TlsSocketStrategy> tlsSocketStrategyRegistry,
+ final HttpConnectionFactory<ManagedHttpClientConnection> connFactory) {
+ return new BasicHttpClientConnectionManager(
+ new DefaultHttpClientConnectionOperator(schemePortResolver, dnsResolver, tlsSocketStrategyRegistry),
+ connFactory);
+ }
+
+ /**
+ * @since 5.4
+ */
+ public static BasicHttpClientConnectionManager create(
+ final Lookup<TlsSocketStrategy> tlsSocketStrategyRegistry,
+ final HttpConnectionFactory<ManagedHttpClientConnection> connFactory) {
+ return new BasicHttpClientConnectionManager(
+ new DefaultHttpClientConnectionOperator(null, null, tlsSocketStrategyRegistry), connFactory);
+ }
+
+ /**
+ * @since 5.4
+ */
+ public static BasicHttpClientConnectionManager create(
+ final Lookup<TlsSocketStrategy> tlsSocketStrategyRegistry) {
+ return new BasicHttpClientConnectionManager(
+ new DefaultHttpClientConnectionOperator(null, null, tlsSocketStrategyRegistry), null);
+ }
+
+ /**
+ * @deprecated Use {@link #create(SchemePortResolver, DnsResolver, Lookup, HttpConnectionFactory)}
+ */
+ @Deprecated
public BasicHttpClientConnectionManager(
- final Lookup<ConnectionSocketFactory> socketFactoryRegistry,
+ final Lookup<org.apache.hc.client5.http.socket.ConnectionSocketFactory> socketFactoryRegistry,
+ final HttpConnectionFactory<ManagedHttpClientConnection> connFactory,
+ final SchemePortResolver schemePortResolver,
+ final DnsResolver dnsResolver) {
+ this(new DefaultHttpClientConnectionOperator(
+ socketFactoryRegistry, schemePortResolver, dnsResolver), connFactory);
+ }
+
+ /**
+ * @deprecated Use {@link #create(Lookup, HttpConnectionFactory)}
+ */
+ @Deprecated
+ public BasicHttpClientConnectionManager(
+ final Lookup<org.apache.hc.client5.http.socket.ConnectionSocketFactory> socketFactoryRegistry,
final HttpConnectionFactory<ManagedHttpClientConnection> connFactory) {
this(socketFactoryRegistry, connFactory, null, null);
}
+ /**
+ * @deprecated Use {@link #create(Lookup)}
+ */
+ @Deprecated
public BasicHttpClientConnectionManager(
- final Lookup<ConnectionSocketFactory> socketFactoryRegistry) {
+ final Lookup<org.apache.hc.client5.http.socket.ConnectionSocketFactory> socketFactoryRegistry) {
this(socketFactoryRegistry, null, null, null);
}
public BasicHttpClientConnectionManager() {
- this(getDefaultRegistry(), null, null, null);
+ this(new DefaultHttpClientConnectionOperator(null, null,
+ RegistryBuilder.<TlsSocketStrategy>create()
+ .register(URIScheme.HTTPS.id, DefaultClientTlsStrategy.createDefault())
+ .build()),
+ null);
}
@Override
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/DefaultHttpClientConnectionOperator.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/DefaultHttpClientConnectionOperator.java
index 95b549e7d..e2189d64d 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/DefaultHttpClientConnectionOperator.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/DefaultHttpClientConnectionOperator.java
@@ -35,6 +35,8 @@ import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
+import javax.net.ssl.SSLSocket;
+
import org.apache.hc.client5.http.ConnectExceptionSupport;
import org.apache.hc.client5.http.DnsResolver;
import org.apache.hc.client5.http.SchemePortResolver;
@@ -45,8 +47,7 @@ import org.apache.hc.client5.http.impl.DefaultSchemePortResolver;
import org.apache.hc.client5.http.io.DetachedSocketFactory;
import org.apache.hc.client5.http.io.HttpClientConnectionOperator;
import org.apache.hc.client5.http.io.ManagedHttpClientConnection;
-import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
-import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
+import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
import org.apache.hc.core5.annotation.Contract;
import org.apache.hc.core5.annotation.Internal;
import org.apache.hc.core5.annotation.ThreadingBehavior;
@@ -86,29 +87,55 @@ public class DefaultHttpClientConnectionOperator implements HttpClientConnection
};
private final DetachedSocketFactory detachedSocketFactory;
- private final Lookup<ConnectionSocketFactory> socketFactoryRegistry;
+ private final Lookup<TlsSocketStrategy> tlsSocketStrategyLookup;
private final SchemePortResolver schemePortResolver;
private final DnsResolver dnsResolver;
+ /**
+ * @deprecated Provided for backward compatibility
+ */
+ @Deprecated
+ static Lookup<TlsSocketStrategy> adapt(final Lookup<org.apache.hc.client5.http.socket.ConnectionSocketFactory> lookup) {
+
+ return name -> {
+ final org.apache.hc.client5.http.socket.ConnectionSocketFactory sf = lookup.lookup(name);
+ return sf instanceof org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory ? (socket, target, port, attachment, context) ->
+ (SSLSocket) ((org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory) sf).createLayeredSocket(socket, target, port, attachment, context) : null;
+ };
+
+ }
+
+
public DefaultHttpClientConnectionOperator(
final DetachedSocketFactory detachedSocketFactory,
- final Lookup<ConnectionSocketFactory> socketFactoryRegistry,
final SchemePortResolver schemePortResolver,
- final DnsResolver dnsResolver) {
+ final DnsResolver dnsResolver,
+ final Lookup<TlsSocketStrategy> tlsSocketStrategyLookup) {
super();
this.detachedSocketFactory = Args.notNull(detachedSocketFactory, "Plain socket factory");
- this.socketFactoryRegistry = Args.notNull(socketFactoryRegistry, "Socket factory registry");
+ this.tlsSocketStrategyLookup = Args.notNull(tlsSocketStrategyLookup, "Socket factory registry");
this.schemePortResolver = schemePortResolver != null ? schemePortResolver :
- DefaultSchemePortResolver.INSTANCE;
+ DefaultSchemePortResolver.INSTANCE;
this.dnsResolver = dnsResolver != null ? dnsResolver :
- SystemDefaultDnsResolver.INSTANCE;
+ SystemDefaultDnsResolver.INSTANCE;
}
+ /**
+ * @deprecated Do not use.
+ */
+ @Deprecated
public DefaultHttpClientConnectionOperator(
- final Lookup<ConnectionSocketFactory> socketFactoryRegistry,
+ final Lookup<org.apache.hc.client5.http.socket.ConnectionSocketFactory> socketFactoryRegistry,
final SchemePortResolver schemePortResolver,
final DnsResolver dnsResolver) {
- this(PLAIN_SOCKET_FACTORY, socketFactoryRegistry, schemePortResolver, dnsResolver);
+ this(PLAIN_SOCKET_FACTORY, schemePortResolver, dnsResolver, adapt(socketFactoryRegistry));
+ }
+
+ public DefaultHttpClientConnectionOperator(
+ final SchemePortResolver schemePortResolver,
+ final DnsResolver dnsResolver,
+ final Lookup<TlsSocketStrategy> tlsSocketStrategyLookup) {
+ this(PLAIN_SOCKET_FACTORY, schemePortResolver, dnsResolver, tlsSocketStrategyLookup);
}
@Override
@@ -198,10 +225,9 @@ public class DefaultHttpClientConnectionOperator implements HttpClientConnection
LOG.debug("{}:{} connected {}->{} as {}",
host.getHostName(), host.getPort(), localAddress, remoteAddress, ConnPoolSupport.getId(conn));
}
- final ConnectionSocketFactory connectionSocketFactory = socketFactoryRegistry != null ? socketFactoryRegistry.lookup(host.getSchemeName()) : null;
- if (connectionSocketFactory instanceof LayeredConnectionSocketFactory && URIScheme.HTTPS.same(host.getSchemeName())) {
- final LayeredConnectionSocketFactory lsf = (LayeredConnectionSocketFactory) connectionSocketFactory;
- final Socket upgradedSocket = lsf.createLayeredSocket(socket, host.getHostName(), port, attachment, context);
+ final TlsSocketStrategy tlsSocketStrategy = tlsSocketStrategyLookup != null ? tlsSocketStrategyLookup.lookup(host.getSchemeName()) : null;
+ if (tlsSocketStrategy != null && URIScheme.HTTPS.same(host.getSchemeName())) {
+ final Socket upgradedSocket = tlsSocketStrategy.upgrade(socket, host.getHostName(), port, attachment, context);
conn.bind(upgradedSocket);
}
return;
@@ -240,23 +266,18 @@ public class DefaultHttpClientConnectionOperator implements HttpClientConnection
final HttpHost host,
final Object attachment,
final HttpContext context) throws IOException {
- final ConnectionSocketFactory sf = socketFactoryRegistry.lookup(host.getSchemeName());
- if (sf == null) {
+ final TlsSocketStrategy tlsSocketStrategy = tlsSocketStrategyLookup != null ? tlsSocketStrategyLookup.lookup(host.getSchemeName()) : null;
+ if (tlsSocketStrategy == null) {
throw new UnsupportedSchemeException(host.getSchemeName() +
" protocol is not supported");
}
- if (!(sf instanceof LayeredConnectionSocketFactory)) {
- throw new UnsupportedSchemeException(host.getSchemeName() +
- " protocol does not support connection upgrade");
- }
- final LayeredConnectionSocketFactory lsf = (LayeredConnectionSocketFactory) sf;
- Socket sock = conn.getSocket();
- if (sock == null) {
+ final Socket socket = conn.getSocket();
+ if (socket == null) {
throw new ConnectionClosedException("Connection is closed");
}
final int port = this.schemePortResolver.resolve(host);
- sock = lsf.createLayeredSocket(sock, host.getHostName(), port, attachment, context);
- conn.bind(sock);
+ final SSLSocket upgradedSocket = tlsSocketStrategy.upgrade(socket, host.getHostName(), port, attachment, context);
+ conn.bind(upgradedSocket);
}
}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManager.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManager.java
index 93b07cf35..8630559c7 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManager.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManager.java
@@ -48,9 +48,8 @@ import org.apache.hc.client5.http.io.HttpClientConnectionManager;
import org.apache.hc.client5.http.io.HttpClientConnectionOperator;
import org.apache.hc.client5.http.io.LeaseRequest;
import org.apache.hc.client5.http.io.ManagedHttpClientConnection;
-import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
-import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
+import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy;
+import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
import org.apache.hc.core5.annotation.Contract;
import org.apache.hc.core5.annotation.Internal;
import org.apache.hc.core5.annotation.ThreadingBehavior;
@@ -120,41 +119,65 @@ public class PoolingHttpClientConnectionManager
private volatile Resolver<HttpHost, TlsConfig> tlsConfigResolver;
public PoolingHttpClientConnectionManager() {
- this(RegistryBuilder.<ConnectionSocketFactory>create()
- .register(URIScheme.HTTP.id, PlainConnectionSocketFactory.getSocketFactory())
- .register(URIScheme.HTTPS.id, SSLConnectionSocketFactory.getSocketFactory())
- .build());
+ this(new DefaultHttpClientConnectionOperator(null, null,
+ RegistryBuilder.<TlsSocketStrategy>create()
+ .register(URIScheme.HTTPS.id, DefaultClientTlsStrategy.createDefault())
+ .build()),
+ PoolConcurrencyPolicy.STRICT,
+ PoolReusePolicy.LIFO,
+ TimeValue.NEG_ONE_MILLISECOND,
+ null);
}
+ /**
+ * @deprecated Use {@link PoolingHttpClientConnectionManagerBuilder}
+ */
+ @Deprecated
public PoolingHttpClientConnectionManager(
- final Registry<ConnectionSocketFactory> socketFactoryRegistry) {
+ final Registry<org.apache.hc.client5.http.socket.ConnectionSocketFactory> socketFactoryRegistry) {
this(socketFactoryRegistry, null);
}
+ /**
+ * @deprecated Use {@link PoolingHttpClientConnectionManagerBuilder}
+ */
+ @Deprecated
public PoolingHttpClientConnectionManager(
- final Registry<ConnectionSocketFactory> socketFactoryRegistry,
+ final Registry<org.apache.hc.client5.http.socket.ConnectionSocketFactory> socketFactoryRegistry,
final HttpConnectionFactory<ManagedHttpClientConnection> connFactory) {
this(socketFactoryRegistry, PoolConcurrencyPolicy.STRICT, TimeValue.NEG_ONE_MILLISECOND, connFactory);
}
+ /**
+ * @deprecated Use {@link PoolingHttpClientConnectionManagerBuilder}
+ */
+ @Deprecated
public PoolingHttpClientConnectionManager(
- final Registry<ConnectionSocketFactory> socketFactoryRegistry,
+ final Registry<org.apache.hc.client5.http.socket.ConnectionSocketFactory> socketFactoryRegistry,
final PoolConcurrencyPolicy poolConcurrencyPolicy,
final TimeValue timeToLive,
final HttpConnectionFactory<ManagedHttpClientConnection> connFactory) {
this(socketFactoryRegistry, poolConcurrencyPolicy, PoolReusePolicy.LIFO, timeToLive, connFactory);
}
+ /**
+ * @deprecated Use {@link PoolingHttpClientConnectionManagerBuilder}
+ */
+ @Deprecated
public PoolingHttpClientConnectionManager(
- final Registry<ConnectionSocketFactory> socketFactoryRegistry,
+ final Registry<org.apache.hc.client5.http.socket.ConnectionSocketFactory> socketFactoryRegistry,
final PoolConcurrencyPolicy poolConcurrencyPolicy,
final PoolReusePolicy poolReusePolicy,
final TimeValue timeToLive) {
this(socketFactoryRegistry, poolConcurrencyPolicy, poolReusePolicy, timeToLive, null);
}
+ /**
+ * @deprecated Use {@link PoolingHttpClientConnectionManagerBuilder}
+ */
+ @Deprecated
public PoolingHttpClientConnectionManager(
- final Registry<ConnectionSocketFactory> socketFactoryRegistry,
+ final Registry<org.apache.hc.client5.http.socket.ConnectionSocketFactory> socketFactoryRegistry,
final PoolConcurrencyPolicy poolConcurrencyPolicy,
final PoolReusePolicy poolReusePolicy,
final TimeValue timeToLive,
@@ -162,8 +185,12 @@ public class PoolingHttpClientConnectionManager
this(socketFactoryRegistry, poolConcurrencyPolicy, poolReusePolicy, timeToLive, null, null, connFactory);
}
+ /**
+ * @deprecated Use {@link PoolingHttpClientConnectionManagerBuilder}
+ */
+ @Deprecated
public PoolingHttpClientConnectionManager(
- final Registry<ConnectionSocketFactory> socketFactoryRegistry,
+ final Registry<org.apache.hc.client5.http.socket.ConnectionSocketFactory> socketFactoryRegistry,
final PoolConcurrencyPolicy poolConcurrencyPolicy,
final PoolReusePolicy poolReusePolicy,
final TimeValue timeToLive,
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManagerBuilder.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManagerBuilder.java
index 799c6ba86..dd5c543e1 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManagerBuilder.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/PoolingHttpClientConnectionManagerBuilder.java
@@ -27,16 +27,16 @@
package org.apache.hc.client5.http.impl.io;
+import javax.net.ssl.SSLSocket;
+
import org.apache.hc.client5.http.DnsResolver;
import org.apache.hc.client5.http.HttpRoute;
import org.apache.hc.client5.http.SchemePortResolver;
import org.apache.hc.client5.http.config.ConnectionConfig;
import org.apache.hc.client5.http.config.TlsConfig;
import org.apache.hc.client5.http.io.ManagedHttpClientConnection;
-import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
-import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
-import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
+import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy;
+import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
import org.apache.hc.core5.function.Resolver;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.URIScheme;
@@ -76,7 +76,7 @@ import org.apache.hc.core5.util.TimeValue;
public class PoolingHttpClientConnectionManagerBuilder {
private HttpConnectionFactory<ManagedHttpClientConnection> connectionFactory;
- private LayeredConnectionSocketFactory sslSocketFactory;
+ private TlsSocketStrategy tlsSocketStrategy;
private SchemePortResolver schemePortResolver;
private DnsResolver dnsResolver;
private PoolConcurrencyPolicy poolConcurrencyPolicy;
@@ -108,11 +108,23 @@ public class PoolingHttpClientConnectionManagerBuilder {
}
/**
- * Assigns {@link LayeredConnectionSocketFactory} instance.
+ * Assigns {@link org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory} instance.
+ *
+ * @deprecated Use {@link #setTlsSocketStrategy(TlsSocketStrategy)}
*/
+ @Deprecated
public final PoolingHttpClientConnectionManagerBuilder setSSLSocketFactory(
- final LayeredConnectionSocketFactory sslSocketFactory) {
- this.sslSocketFactory = sslSocketFactory;
+ final org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory sslSocketFactory) {
+ this.tlsSocketStrategy = (socket, target, port, attachment, context) ->
+ (SSLSocket) sslSocketFactory.createLayeredSocket(socket, target, port, context);
+ return this;
+ }
+
+ /**
+ * Assigns {@link TlsSocketStrategy} instance.
+ */
+ public final PoolingHttpClientConnectionManagerBuilder setTlsSocketStrategy(final TlsSocketStrategy tlsSocketStrategy) {
+ this.tlsSocketStrategy = tlsSocketStrategy;
return this;
}
@@ -262,19 +274,17 @@ public class PoolingHttpClientConnectionManagerBuilder {
}
public PoolingHttpClientConnectionManager build() {
- @SuppressWarnings("resource") final PoolingHttpClientConnectionManager poolingmgr = new PoolingHttpClientConnectionManager(
- RegistryBuilder.<ConnectionSocketFactory>create()
- .register(URIScheme.HTTP.id, PlainConnectionSocketFactory.getSocketFactory())
- .register(URIScheme.HTTPS.id, sslSocketFactory != null ? sslSocketFactory :
- (systemProperties ?
- SSLConnectionSocketFactory.getSystemSocketFactory() :
- SSLConnectionSocketFactory.getSocketFactory()))
- .build(),
+ final PoolingHttpClientConnectionManager poolingmgr = new PoolingHttpClientConnectionManager(
+ new DefaultHttpClientConnectionOperator(schemePortResolver, dnsResolver,
+ RegistryBuilder.<TlsSocketStrategy>create()
+ .register(URIScheme.HTTPS.id, tlsSocketStrategy != null ? tlsSocketStrategy :
+ (systemProperties ?
+ DefaultClientTlsStrategy.createSystemDefault() :
+ DefaultClientTlsStrategy.createDefault()))
+ .build()),
poolConcurrencyPolicy,
poolReusePolicy,
null,
- schemePortResolver,
- dnsResolver,
connectionFactory);
poolingmgr.setSocketConfigResolver(socketConfigResolver);
poolingmgr.setConnectionConfigResolver(connectionConfigResolver);
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManager.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManager.java
index 6ebaf2129..3aa5c4618 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManager.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManager.java
@@ -129,7 +129,7 @@ public class PoolingAsyncClientConnectionManager implements AsyncClientConnectio
public PoolingAsyncClientConnectionManager() {
this(RegistryBuilder.<TlsStrategy>create()
- .register(URIScheme.HTTPS.getId(), DefaultClientTlsStrategy.getDefault())
+ .register(URIScheme.HTTPS.getId(), DefaultClientTlsStrategy.createDefault())
.build());
}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManagerBuilder.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManagerBuilder.java
index 6f72c6bb0..16feeaf7b 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManagerBuilder.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/nio/PoolingAsyncClientConnectionManagerBuilder.java
@@ -242,9 +242,9 @@ public class PoolingAsyncClientConnectionManagerBuilder {
}
} else {
if (systemProperties) {
- tlsStrategyCopy = DefaultClientTlsStrategy.getSystemDefault();
+ tlsStrategyCopy = DefaultClientTlsStrategy.createSystemDefault();
} else {
- tlsStrategyCopy = DefaultClientTlsStrategy.getDefault();
+ tlsStrategyCopy = DefaultClientTlsStrategy.createDefault();
}
}
}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/socket/ConnectionSocketFactory.java b/httpclient5/src/main/java/org/apache/hc/client5/http/socket/ConnectionSocketFactory.java
index 9b0c7b72c..bffa96661 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/socket/ConnectionSocketFactory.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/socket/ConnectionSocketFactory.java
@@ -43,9 +43,10 @@ import org.apache.hc.core5.util.Timeout;
/**
* A factory for creating and connecting connection sockets.
*
- * @since 4.3
+ * @deprecated Do not use.
*/
@Contract(threading = ThreadingBehavior.STATELESS)
+@Deprecated
public interface ConnectionSocketFactory {
/**
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/socket/LayeredConnectionSocketFactory.java b/httpclient5/src/main/java/org/apache/hc/client5/http/socket/LayeredConnectionSocketFactory.java
index 36dfa80f8..99624a449 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/socket/LayeredConnectionSocketFactory.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/socket/LayeredConnectionSocketFactory.java
@@ -37,8 +37,9 @@ import org.apache.hc.core5.http.protocol.HttpContext;
/**
* Extended {@link ConnectionSocketFactory} interface for layered sockets such as SSL/TLS.
*
- * @since 4.3
+ * @deprecated Use {@link org.apache.hc.client5.http.ssl.TlsSocketStrategy}.
*/
+@Deprecated
@Contract(threading = ThreadingBehavior.STATELESS)
public interface LayeredConnectionSocketFactory extends ConnectionSocketFactory {
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/socket/PlainConnectionSocketFactory.java b/httpclient5/src/main/java/org/apache/hc/client5/http/socket/PlainConnectionSocketFactory.java
index ce2d8fb40..3396bcaa0 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/socket/PlainConnectionSocketFactory.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/socket/PlainConnectionSocketFactory.java
@@ -46,8 +46,13 @@ import org.apache.hc.core5.util.TimeValue;
/**
* The default class for creating plain (unencrypted) sockets.
*
- * @since 4.3
+ * @deprecated Use {@link org.apache.hc.client5.http.io.DetachedSocketFactory}.
+ * Please note this interface is considered internal.
+ *
+ * @see org.apache.hc.client5.http.impl.io.DefaultHttpClientConnectionOperator
+ * @see org.apache.hc.client5.http.io.DetachedSocketFactory
*/
+@Deprecated
@Contract(threading = ThreadingBehavior.STATELESS)
public class PlainConnectionSocketFactory implements ConnectionSocketFactory {
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/DefaultClientTlsStrategy.java b/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/DefaultClientTlsStrategy.java
index 1267071a8..861b4c5f9 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/DefaultClientTlsStrategy.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/DefaultClientTlsStrategy.java
@@ -48,13 +48,19 @@ import org.apache.hc.core5.ssl.SSLContexts;
@Contract(threading = ThreadingBehavior.STATELESS)
public class DefaultClientTlsStrategy extends AbstractClientTlsStrategy {
- public static TlsStrategy getDefault() {
+ /**
+ * @since 5.4
+ */
+ public static DefaultClientTlsStrategy createDefault() {
return new DefaultClientTlsStrategy(
SSLContexts.createDefault(),
HttpsSupport.getDefaultHostnameVerifier());
}
- public static TlsStrategy getSystemDefault() {
+ /**
+ * @since 5.4
+ */
+ public static DefaultClientTlsStrategy createSystemDefault() {
return new DefaultClientTlsStrategy(
SSLContexts.createSystemDefault(),
HttpsSupport.getSystemProtocols(),
@@ -63,6 +69,22 @@ public class DefaultClientTlsStrategy extends AbstractClientTlsStrategy {
HttpsSupport.getDefaultHostnameVerifier());
}
+ /**
+ * @deprecated Use {@link #createDefault()}.
+ */
+ @Deprecated
+ public static TlsStrategy getDefault() {
+ return createDefault();
+ }
+
+ /**
+ * @deprecated Use {@link #createSystemDefault()}.
+ */
+ @Deprecated
+ public static TlsStrategy getSystemDefault() {
+ return createSystemDefault();
+ }
+
/**
* @deprecated To be removed.
*/
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/SSLConnectionSocketFactory.java b/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/SSLConnectionSocketFactory.java
index b8cbde45c..3ffe908e3 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/SSLConnectionSocketFactory.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/SSLConnectionSocketFactory.java
@@ -56,7 +56,6 @@ import javax.net.ssl.SSLSocket;
import javax.security.auth.x500.X500Principal;
import org.apache.hc.client5.http.config.TlsConfig;
-import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
import org.apache.hc.core5.annotation.Contract;
import org.apache.hc.core5.annotation.ThreadingBehavior;
import org.apache.hc.core5.http.HttpHost;
@@ -79,10 +78,11 @@ import org.slf4j.LoggerFactory;
* SSLSocketFactory can be used to validate the identity of the HTTPS server against a list of
* trusted certificates and to authenticate to the HTTPS server using a private key.
*
- * @since 4.3
+ * @deprecated Use {@link DefaultClientTlsStrategy}.
*/
+@Deprecated
@Contract(threading = ThreadingBehavior.STATELESS)
-public class SSLConnectionSocketFactory implements LayeredConnectionSocketFactory {
+public class SSLConnectionSocketFactory implements org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory {
private static final String WEAK_KEY_EXCHANGES
= "^(TLS|SSL)_(NULL|ECDH_anon|DH_anon|DH_anon_EXPORT|DHE_RSA_EXPORT|DHE_DSS_EXPORT|"
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/SSLConnectionSocketFactoryBuilder.java b/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/SSLConnectionSocketFactoryBuilder.java
index 0926dce4c..f91122758 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/SSLConnectionSocketFactoryBuilder.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/SSLConnectionSocketFactoryBuilder.java
@@ -57,8 +57,9 @@ import org.apache.hc.core5.ssl.SSLContexts;
* <li>https.cipherSuites</li>
* </ul>
*
- * @since 5.0
+ * @deprecated Use {@link DefaultClientTlsStrategy}
*/
+@Deprecated
public class SSLConnectionSocketFactoryBuilder {
public static SSLConnectionSocketFactoryBuilder create() {
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConfiguration.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConfiguration.java
index bb2074766..35246ff02 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConfiguration.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientConfiguration.java
@@ -57,7 +57,8 @@ 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.ManagedHttpClientConnection;
import org.apache.hc.client5.http.protocol.HttpClientContext;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
+import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy;
+import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
import org.apache.hc.core5.http.ClassicHttpRequest;
import org.apache.hc.core5.http.ClassicHttpResponse;
import org.apache.hc.core5.http.Header;
@@ -150,7 +151,7 @@ public class ClientConfiguration {
// Create a registry of custom connection socket factories for supported
// protocol schemes.
- final SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext);
+ final TlsSocketStrategy tlsStrategy = new DefaultClientTlsStrategy(sslContext);
// Use custom DNS resolver to override the system DNS resolution.
final DnsResolver dnsResolver = new SystemDefaultDnsResolver() {
@@ -168,7 +169,7 @@ public class ClientConfiguration {
// Create a connection manager with custom configuration.
final PoolingHttpClientConnectionManager connManager = PoolingHttpClientConnectionManagerBuilder.create()
- .setSSLSocketFactory(sslConnectionSocketFactory)
+ .setTlsSocketStrategy(tlsStrategy)
.setConnectionFactory(connFactory)
.setDnsResolver(dnsResolver)
.setPoolConcurrencyPolicy(PoolConcurrencyPolicy.STRICT)
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomPublicSuffixList.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomPublicSuffixList.java
index 37be07369..3007490f6 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomPublicSuffixList.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomPublicSuffixList.java
@@ -38,8 +38,9 @@ import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuil
import org.apache.hc.client5.http.io.HttpClientConnectionManager;
import org.apache.hc.client5.http.psl.PublicSuffixMatcher;
import org.apache.hc.client5.http.psl.PublicSuffixMatcherLoader;
+import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy;
import org.apache.hc.client5.http.ssl.DefaultHostnameVerifier;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
+import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
import org.apache.hc.core5.http.config.Lookup;
import org.apache.hc.core5.http.config.RegistryBuilder;
import org.apache.hc.core5.http.io.entity.EntityUtils;
@@ -66,11 +67,11 @@ public class ClientCustomPublicSuffixList {
.register(StandardCookieSpec.RELAXED, cookieSpecFactory)
.register(StandardCookieSpec.STRICT, cookieSpecFactory)
.build();
- final SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
+ final TlsSocketStrategy tlsStrategy = new DefaultClientTlsStrategy(
SSLContexts.createDefault(),
new DefaultHostnameVerifier(publicSuffixMatcher));
final HttpClientConnectionManager cm = PoolingHttpClientConnectionManagerBuilder.create()
- .setSSLSocketFactory(sslsf)
+ .setTlsSocketStrategy(tlsStrategy)
.build();
try (final CloseableHttpClient httpclient = HttpClients.custom()
.setConnectionManager(cm)
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomSSL.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomSSL.java
index d7b625203..a130b6848 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomSSL.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomSSL.java
@@ -38,8 +38,8 @@ import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
import org.apache.hc.client5.http.io.HttpClientConnectionManager;
import org.apache.hc.client5.http.protocol.HttpClientContext;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
-import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder;
+import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy;
+import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.http.message.StatusLine;
import org.apache.hc.core5.http.ssl.TLS;
@@ -67,12 +67,10 @@ public class ClientCustomSSL {
return "CN=httpbin.org".equalsIgnoreCase(cert.getSubjectDN().getName());
})
.build();
- final SSLConnectionSocketFactory sslSocketFactory = SSLConnectionSocketFactoryBuilder.create()
- .setSslContext(sslContext)
- .build();
+ final TlsSocketStrategy tlsStrategy = new DefaultClientTlsStrategy(sslContext);
// Allow TLSv1.3 protocol only
final HttpClientConnectionManager cm = PoolingHttpClientConnectionManagerBuilder.create()
- .setSSLSocketFactory(sslSocketFactory)
+ .setTlsSocketStrategy(tlsStrategy)
.setDefaultTlsConfig(TlsConfig.custom()
.setHandshakeTimeout(Timeout.ofSeconds(30))
.setSupportedProtocols(TLS.V_1_3)
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestBasicHttpClientConnectionManager.java b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestBasicHttpClientConnectionManager.java
index c567e09bc..94fd2d38c 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestBasicHttpClientConnectionManager.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestBasicHttpClientConnectionManager.java
@@ -32,6 +32,8 @@ import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.concurrent.TimeUnit;
+import javax.net.ssl.SSLSocket;
+
import org.apache.hc.client5.http.DnsResolver;
import org.apache.hc.client5.http.HttpRoute;
import org.apache.hc.client5.http.SchemePortResolver;
@@ -42,8 +44,7 @@ import org.apache.hc.client5.http.io.DetachedSocketFactory;
import org.apache.hc.client5.http.io.LeaseRequest;
import org.apache.hc.client5.http.io.ManagedHttpClientConnection;
import org.apache.hc.client5.http.protocol.HttpClientContext;
-import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
-import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
+import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.config.Lookup;
import org.apache.hc.core5.http.io.HttpConnectionFactory;
@@ -65,14 +66,16 @@ public class TestBasicHttpClientConnectionManager {
@Mock
private HttpConnectionFactory<ManagedHttpClientConnection> connFactory;
@Mock
- private Lookup<ConnectionSocketFactory> socketFactoryRegistry;
+ private Lookup<TlsSocketStrategy> tlsSocketStrategyLookup;
@Mock
private DetachedSocketFactory detachedSocketFactory;
@Mock
- private LayeredConnectionSocketFactory sslSocketFactory;
+ private TlsSocketStrategy tlsSocketStrategy;
@Mock
private Socket socket;
@Mock
+ private SSLSocket upgradedSocket;
+ @Mock
private SchemePortResolver schemePortResolver;
@Mock
private DnsResolver dnsResolver;
@@ -83,7 +86,7 @@ public class TestBasicHttpClientConnectionManager {
public void setup() throws Exception {
MockitoAnnotations.openMocks(this);
mgr = new BasicHttpClientConnectionManager(new DefaultHttpClientConnectionOperator(
- detachedSocketFactory, socketFactoryRegistry, schemePortResolver, dnsResolver),
+ detachedSocketFactory, schemePortResolver, dnsResolver, tlsSocketStrategyLookup),
connFactory);
}
@@ -385,13 +388,13 @@ public class TestBasicHttpClientConnectionManager {
Mockito.when(schemePortResolver.resolve(target)).thenReturn(8443);
Mockito.when(detachedSocketFactory.create(Mockito.any())).thenReturn(socket);
- Mockito.when(socketFactoryRegistry.lookup("https")).thenReturn(sslSocketFactory);
- Mockito.when(sslSocketFactory.createLayeredSocket(
+ Mockito.when(tlsSocketStrategyLookup.lookup("https")).thenReturn(tlsSocketStrategy);
+ Mockito.when(tlsSocketStrategy.upgrade(
Mockito.same(socket),
Mockito.eq("somehost"),
Mockito.eq(8443),
Mockito.any(),
- Mockito.any())).thenReturn(socket);
+ Mockito.any())).thenReturn(upgradedSocket);
mgr.connect(endpoint1, null, context);
@@ -399,7 +402,7 @@ public class TestBasicHttpClientConnectionManager {
Mockito.verify(schemePortResolver, Mockito.times(1)).resolve(target);
Mockito.verify(detachedSocketFactory, Mockito.times(1)).create(null);
Mockito.verify(socket, Mockito.times(1)).connect(new InetSocketAddress(remote, 8443), 234);
- Mockito.verify(sslSocketFactory).createLayeredSocket(socket, "somehost", 8443, tlsConfig, context);
+ Mockito.verify(tlsSocketStrategy).upgrade(socket, "somehost", 8443, tlsConfig, context);
mgr.connect(endpoint1, TimeValue.ofMilliseconds(123), context);
@@ -407,7 +410,7 @@ public class TestBasicHttpClientConnectionManager {
Mockito.verify(schemePortResolver, Mockito.times(2)).resolve(target);
Mockito.verify(detachedSocketFactory, Mockito.times(2)).create(null);
Mockito.verify(socket, Mockito.times(1)).connect(new InetSocketAddress(remote, 8443), 123);
- Mockito.verify(sslSocketFactory, Mockito.times(2)).createLayeredSocket(socket, "somehost", 8443, tlsConfig, context);
+ Mockito.verify(tlsSocketStrategy, Mockito.times(2)).upgrade(socket, "somehost", 8443, tlsConfig, context);
}
@Test
@@ -441,7 +444,7 @@ public class TestBasicHttpClientConnectionManager {
Mockito.when(dnsResolver.resolve("someproxy")).thenReturn(new InetAddress[] {remote});
Mockito.when(schemePortResolver.resolve(proxy)).thenReturn(8080);
Mockito.when(schemePortResolver.resolve(target)).thenReturn(8443);
- Mockito.when(socketFactoryRegistry.lookup("https")).thenReturn(sslSocketFactory);
+ Mockito.when(tlsSocketStrategyLookup.lookup("https")).thenReturn(tlsSocketStrategy);
Mockito.when(detachedSocketFactory.create(Mockito.any())).thenReturn(socket);
mgr.connect(endpoint1, null, context);
@@ -456,7 +459,7 @@ public class TestBasicHttpClientConnectionManager {
mgr.upgrade(endpoint1, context);
Mockito.verify(schemePortResolver, Mockito.times(1)).resolve(target);
- Mockito.verify(sslSocketFactory, Mockito.times(1)).createLayeredSocket(
+ Mockito.verify(tlsSocketStrategy, Mockito.times(1)).upgrade(
socket, "somehost", 8443, tlsConfig, context);
}
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestHttpClientConnectionOperator.java b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestHttpClientConnectionOperator.java
index 5d2050100..fd5f1e600 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestHttpClientConnectionOperator.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestHttpClientConnectionOperator.java
@@ -34,6 +34,8 @@ import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.concurrent.TimeUnit;
+import javax.net.ssl.SSLSocket;
+
import org.apache.hc.client5.http.ConnectTimeoutException;
import org.apache.hc.client5.http.DnsResolver;
import org.apache.hc.client5.http.HttpHostConnectException;
@@ -42,8 +44,7 @@ import org.apache.hc.client5.http.UnsupportedSchemeException;
import org.apache.hc.client5.http.config.TlsConfig;
import org.apache.hc.client5.http.io.DetachedSocketFactory;
import org.apache.hc.client5.http.io.ManagedHttpClientConnection;
-import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
-import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
+import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.config.Lookup;
import org.apache.hc.core5.http.io.SocketConfig;
@@ -62,8 +63,8 @@ public class TestHttpClientConnectionOperator {
private ManagedHttpClientConnection conn;
private Socket socket;
private DetachedSocketFactory detachedSocketFactory;
- private LayeredConnectionSocketFactory sslSocketFactory;
- private Lookup<ConnectionSocketFactory> socketFactoryRegistry;
+ private TlsSocketStrategy tlsSocketStrategy;
+ private Lookup<TlsSocketStrategy> tlsSocketStrategyLookup;
private SchemePortResolver schemePortResolver;
private DnsResolver dnsResolver;
private DefaultHttpClientConnectionOperator connectionOperator;
@@ -73,12 +74,12 @@ public class TestHttpClientConnectionOperator {
conn = Mockito.mock(ManagedHttpClientConnection.class);
socket = Mockito.mock(Socket.class);
detachedSocketFactory = Mockito.mock(DetachedSocketFactory.class);
- sslSocketFactory = Mockito.mock(LayeredConnectionSocketFactory.class);
- socketFactoryRegistry = Mockito.mock(Lookup.class);
+ tlsSocketStrategy = Mockito.mock(TlsSocketStrategy.class);
+ tlsSocketStrategyLookup = Mockito.mock(Lookup.class);
schemePortResolver = Mockito.mock(SchemePortResolver.class);
dnsResolver = Mockito.mock(DnsResolver.class);
connectionOperator = new DefaultHttpClientConnectionOperator(
- detachedSocketFactory, socketFactoryRegistry, schemePortResolver, dnsResolver);
+ detachedSocketFactory, schemePortResolver, dnsResolver, tlsSocketStrategyLookup);
}
@Test
@@ -131,9 +132,9 @@ public class TestHttpClientConnectionOperator {
Mockito.when(schemePortResolver.resolve(host)).thenReturn(443);
Mockito.when(detachedSocketFactory.create(Mockito.any())).thenReturn(socket);
- Mockito.when(socketFactoryRegistry.lookup("https")).thenReturn(sslSocketFactory);
- final Socket upgradedSocket = Mockito.mock(Socket.class);
- Mockito.when(sslSocketFactory.createLayeredSocket(
+ Mockito.when(tlsSocketStrategyLookup.lookup("https")).thenReturn(tlsSocketStrategy);
+ final SSLSocket upgradedSocket = Mockito.mock(SSLSocket.class);
+ Mockito.when(tlsSocketStrategy.upgrade(
Mockito.same(socket),
Mockito.eq("somehost"),
Mockito.eq(443),
@@ -146,7 +147,7 @@ public class TestHttpClientConnectionOperator {
Mockito.verify(socket).connect(new InetSocketAddress(ip1, 443), 123);
Mockito.verify(conn, Mockito.times(2)).bind(socket);
- Mockito.verify(sslSocketFactory).createLayeredSocket(socket, "somehost", 443, tlsConfig, context);
+ Mockito.verify(tlsSocketStrategy).upgrade(socket, "somehost", 443, tlsConfig, context);
Mockito.verify(conn, Mockito.times(1)).bind(upgradedSocket);
}
@@ -240,19 +241,20 @@ public class TestHttpClientConnectionOperator {
Mockito.when(conn.isOpen()).thenReturn(true);
Mockito.when(conn.getSocket()).thenReturn(socket);
- Mockito.when(socketFactoryRegistry.lookup("https")).thenReturn(sslSocketFactory);
+ Mockito.when(tlsSocketStrategyLookup.lookup("https")).thenReturn(tlsSocketStrategy);
Mockito.when(schemePortResolver.resolve(host)).thenReturn(443);
- Mockito.when(sslSocketFactory.createSocket(Mockito.any())).thenReturn(socket);
- Mockito.when(sslSocketFactory.createLayeredSocket(
+
+ final SSLSocket upgradedSocket = Mockito.mock(SSLSocket.class);
+ Mockito.when(tlsSocketStrategy.upgrade(
Mockito.any(),
Mockito.eq("somehost"),
Mockito.eq(443),
Mockito.eq(Timeout.ofMilliseconds(345)),
- Mockito.any())).thenReturn(socket);
+ Mockito.any())).thenReturn(upgradedSocket);
connectionOperator.upgrade(conn, host, Timeout.ofMilliseconds(345), context);
- Mockito.verify(conn).bind(socket);
+ Mockito.verify(conn).bind(upgradedSocket);
}
@Test
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestPoolingHttpClientConnectionManager.java b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestPoolingHttpClientConnectionManager.java
index 4f43ce0c1..8496a8c69 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestPoolingHttpClientConnectionManager.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/impl/io/TestPoolingHttpClientConnectionManager.java
@@ -34,6 +34,8 @@ import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+import javax.net.ssl.SSLSocket;
+
import org.apache.hc.client5.http.DnsResolver;
import org.apache.hc.client5.http.HttpRoute;
import org.apache.hc.client5.http.SchemePortResolver;
@@ -44,8 +46,7 @@ import org.apache.hc.client5.http.io.DetachedSocketFactory;
import org.apache.hc.client5.http.io.LeaseRequest;
import org.apache.hc.client5.http.io.ManagedHttpClientConnection;
import org.apache.hc.client5.http.protocol.HttpClientContext;
-import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
-import org.apache.hc.client5.http.socket.LayeredConnectionSocketFactory;
+import org.apache.hc.client5.http.ssl.TlsSocketStrategy;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.config.Lookup;
import org.apache.hc.core5.http.io.SocketConfig;
@@ -68,14 +69,16 @@ public class TestPoolingHttpClientConnectionManager {
@Mock
private ManagedHttpClientConnection conn;
@Mock
- private Lookup<ConnectionSocketFactory> socketFactoryRegistry;
+ private Lookup<TlsSocketStrategy> tlsSocketStrategyLookup;
@Mock
private DetachedSocketFactory detachedSocketFactory;
@Mock
- private LayeredConnectionSocketFactory sslSocketFactory;
+ private TlsSocketStrategy tlsSocketStrategy;
@Mock
private Socket socket;
@Mock
+ private SSLSocket upgradedSocket;
+ @Mock
private SchemePortResolver schemePortResolver;
@Mock
private DnsResolver dnsResolver;
@@ -90,7 +93,7 @@ public class TestPoolingHttpClientConnectionManager {
public void setup() throws Exception {
MockitoAnnotations.openMocks(this);
mgr = new PoolingHttpClientConnectionManager(new DefaultHttpClientConnectionOperator(
- detachedSocketFactory, socketFactoryRegistry, schemePortResolver, dnsResolver), pool,
+ detachedSocketFactory, schemePortResolver, dnsResolver, tlsSocketStrategyLookup), pool,
null);
}
@@ -263,13 +266,13 @@ public class TestPoolingHttpClientConnectionManager {
Mockito.when(schemePortResolver.resolve(target)).thenReturn(8443);
Mockito.when(detachedSocketFactory.create(Mockito.any())).thenReturn(socket);
- Mockito.when(socketFactoryRegistry.lookup("https")).thenReturn(sslSocketFactory);
- Mockito.when(sslSocketFactory.createLayeredSocket(
+ Mockito.when(tlsSocketStrategyLookup.lookup("https")).thenReturn(tlsSocketStrategy);
+ Mockito.when(tlsSocketStrategy.upgrade(
Mockito.same(socket),
Mockito.eq("somehost"),
Mockito.eq(8443),
Mockito.any(),
- Mockito.any())).thenReturn(socket);
+ Mockito.any())).thenReturn(upgradedSocket);
mgr.connect(endpoint1, null, context);
@@ -277,7 +280,7 @@ public class TestPoolingHttpClientConnectionManager {
Mockito.verify(schemePortResolver, Mockito.times(1)).resolve(target);
Mockito.verify(detachedSocketFactory, Mockito.times(1)).create(null);
Mockito.verify(socket, Mockito.times(1)).connect(new InetSocketAddress(remote, 8443), 234);
- Mockito.verify(sslSocketFactory).createLayeredSocket(socket, "somehost", 8443, tlsConfig, context);
+ Mockito.verify(tlsSocketStrategy).upgrade(socket, "somehost", 8443, tlsConfig, context);
mgr.connect(endpoint1, TimeValue.ofMilliseconds(123), context);
@@ -285,7 +288,7 @@ public class TestPoolingHttpClientConnectionManager {
Mockito.verify(schemePortResolver, Mockito.times(2)).resolve(target);
Mockito.verify(detachedSocketFactory, Mockito.times(2)).create(null);
Mockito.verify(socket, Mockito.times(1)).connect(new InetSocketAddress(remote, 8443), 123);
- Mockito.verify(sslSocketFactory, Mockito.times(2)).createLayeredSocket(socket, "somehost", 8443, tlsConfig, context);
+ Mockito.verify(tlsSocketStrategy, Mockito.times(2)).upgrade(socket, "somehost", 8443, tlsConfig, context);
}
@Test
@@ -312,7 +315,6 @@ public class TestPoolingHttpClientConnectionManager {
final ConnectionEndpoint endpoint1 = connRequest1.get(Timeout.ofSeconds(1));
Assertions.assertNotNull(endpoint1);
- final LayeredConnectionSocketFactory sslsf = Mockito.mock(LayeredConnectionSocketFactory.class);
final HttpClientContext context = HttpClientContext.create();
final SocketConfig sconfig = SocketConfig.custom().build();
@@ -330,7 +332,7 @@ public class TestPoolingHttpClientConnectionManager {
Mockito.when(dnsResolver.resolve("someproxy")).thenReturn(new InetAddress[] {remote});
Mockito.when(schemePortResolver.resolve(proxy)).thenReturn(8080);
Mockito.when(schemePortResolver.resolve(target)).thenReturn(8443);
- Mockito.when(socketFactoryRegistry.lookup("https")).thenReturn(sslsf);
+ Mockito.when(tlsSocketStrategyLookup.lookup("https")).thenReturn(tlsSocketStrategy);
Mockito.when(detachedSocketFactory.create(Mockito.any())).thenReturn(socket);
mgr.connect(endpoint1, null, context);
@@ -346,7 +348,7 @@ public class TestPoolingHttpClientConnectionManager {
mgr.upgrade(endpoint1, context);
Mockito.verify(schemePortResolver, Mockito.times(1)).resolve(target);
- Mockito.verify(sslsf, Mockito.times(1)).createLayeredSocket(
+ Mockito.verify(tlsSocketStrategy, Mockito.times(1)).upgrade(
socket, "somehost", 8443, tlsConfig, context);
}
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/ssl/TestSSLSocketFactory.java b/httpclient5/src/test/java/org/apache/hc/client5/http/ssl/TestSSLSocketFactory.java
deleted file mode 100644
index a798d7ff9..000000000
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/ssl/TestSSLSocketFactory.java
+++ /dev/null
@@ -1,77 +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.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.hc.client5.http.ssl;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-/**
- * Unit tests for {@link SSLConnectionSocketFactory}.
- */
-public class TestSSLSocketFactory {
-
- @Test
- public void testStrongCipherSuites() {
- final String[] strongCipherSuites = {
- "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
- "TLS_RSA_WITH_AES_256_CBC_SHA256",
- "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",
- "TLS_RSA_WITH_AES_128_CBC_SHA",
- "TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
- "TLS_RSA_WITH_AES_256_GCM_SHA384"
- };
- for (final String cipherSuite : strongCipherSuites) {
- Assertions.assertFalse(SSLConnectionSocketFactory.isWeakCipherSuite(cipherSuite));
- }
- }
-
- @Test
- public void testWeakCiphersDisabledByDefault() {
- final String[] weakCiphersSuites = {
- "SSL_RSA_WITH_RC4_128_SHA",
- "SSL_RSA_WITH_3DES_EDE_CBC_SHA",
- "TLS_DH_anon_WITH_AES_128_CBC_SHA",
- "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
- "SSL_RSA_WITH_NULL_SHA",
- "SSL_RSA_WITH_3DES_EDE_CBC_SHA",
- "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
- "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA",
- "TLS_DH_anon_WITH_AES_256_GCM_SHA384",
- "TLS_ECDH_anon_WITH_AES_256_CBC_SHA",
- "TLS_RSA_WITH_NULL_SHA256",
- "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
- "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5",
- "TLS_KRB5_EXPORT_WITH_RC4_40_SHA",
- "SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5"
- };
- for (final String cipherSuite : weakCiphersSuites) {
- Assertions.assertTrue(SSLConnectionSocketFactory.isWeakCipherSuite(cipherSuite));
- }
- }
-
-}