2626import org .apache .hc .client5 .http .io .HttpClientConnectionManager ;
2727import org .apache .hc .client5 .http .protocol .HttpClientContext ;
2828import org .apache .hc .client5 .http .socket .ConnectionSocketFactory ;
29+ import org .apache .hc .client5 .http .socket .LayeredConnectionSocketFactory ;
2930import org .apache .hc .client5 .http .socket .PlainConnectionSocketFactory ;
3031import org .apache .hc .client5 .http .ssl .SSLConnectionSocketFactory ;
3132import org .apache .hc .core5 .http .ClassicHttpResponse ;
4445import org .apache .hc .core5 .http .impl .io .DefaultHttpResponseParserFactory ;
4546import org .apache .hc .core5 .http .io .SocketConfig ;
4647import org .apache .hc .core5 .http .io .entity .EntityTemplate ;
48+ import org .apache .hc .core5 .http .protocol .HttpContext ;
4749import org .apache .hc .core5 .io .CloseMode ;
4850import org .apache .hc .core5 .io .IOCallback ;
4951import org .apache .hc .core5 .net .URIBuilder ;
6264import java .net .ConnectException ;
6365import java .net .InetSocketAddress ;
6466import java .net .NoRouteToHostException ;
67+ import java .net .Socket ;
6568import java .net .SocketTimeoutException ;
6669import java .net .URI ;
6770import java .net .URISyntaxException ;
@@ -97,10 +100,10 @@ public class HttpAPIClientHelper {
97100
98101 private String defaultUserAgent ;
99102 private Object metricsRegistry ;
100- public HttpAPIClientHelper (Map <String , String > configuration , Object metricsRegistry ) {
103+ public HttpAPIClientHelper (Map <String , String > configuration , Object metricsRegistry , boolean initSslContext ) {
101104 this .chConfiguration = configuration ;
102105 this .metricsRegistry = metricsRegistry ;
103- this .httpClient = createHttpClient ();
106+ this .httpClient = createHttpClient (initSslContext );
104107
105108 RequestConfig .Builder reqConfBuilder = RequestConfig .custom ();
106109 MapUtils .applyLong (chConfiguration , "connection_request_timeout" ,
@@ -175,11 +178,10 @@ private ConnectionConfig createConnectionConfig() {
175178 return connConfig .build ();
176179 }
177180
178- private HttpClientConnectionManager basicConnectionManager (SSLContext sslContext , SocketConfig socketConfig ) {
181+ private HttpClientConnectionManager basicConnectionManager (LayeredConnectionSocketFactory sslConnectionSocketFactory , SocketConfig socketConfig ) {
179182 RegistryBuilder <ConnectionSocketFactory > registryBuilder = RegistryBuilder .create ();
180183 registryBuilder .register ("http" , PlainConnectionSocketFactory .getSocketFactory ());
181- registryBuilder .register ("https" , new SSLConnectionSocketFactory (sslContext ));
182-
184+ registryBuilder .register ("https" , sslConnectionSocketFactory );
183185
184186 BasicHttpClientConnectionManager connManager = new BasicHttpClientConnectionManager (registryBuilder .build ());
185187 connManager .setConnectionConfig (createConnectionConfig ());
@@ -188,7 +190,7 @@ private HttpClientConnectionManager basicConnectionManager(SSLContext sslContext
188190 return connManager ;
189191 }
190192
191- private HttpClientConnectionManager poolConnectionManager (SSLContext sslContext , SocketConfig socketConfig ) {
193+ private HttpClientConnectionManager poolConnectionManager (LayeredConnectionSocketFactory sslConnectionSocketFactory , SocketConfig socketConfig ) {
192194 PoolingHttpClientConnectionManagerBuilder connMgrBuilder = PoolingHttpClientConnectionManagerBuilder .create ()
193195 .setPoolConcurrencyPolicy (PoolConcurrencyPolicy .LAX );
194196
@@ -221,7 +223,7 @@ private HttpClientConnectionManager poolConnectionManager(SSLContext sslContext,
221223 DefaultHttpResponseParserFactory .INSTANCE );
222224
223225 connMgrBuilder .setConnectionFactory (connectionFactory );
224- connMgrBuilder .setSSLSocketFactory (new SSLConnectionSocketFactory ( sslContext ) );
226+ connMgrBuilder .setSSLSocketFactory (sslConnectionSocketFactory );
225227 connMgrBuilder .setDefaultSocketConfig (socketConfig );
226228 PoolingHttpClientConnectionManager phccm = connMgrBuilder .build ();
227229 if (metricsRegistry != null ) {
@@ -238,12 +240,12 @@ private HttpClientConnectionManager poolConnectionManager(SSLContext sslContext,
238240 return phccm ;
239241 }
240242
241- public CloseableHttpClient createHttpClient () {
242-
243+ public CloseableHttpClient createHttpClient (boolean initSslContext ) {
243244 // Top Level builders
244245 HttpClientBuilder clientBuilder = HttpClientBuilder .create ();
245- SSLContext sslContext = createSSLContext ();
246-
246+ SSLContext sslContext = initSslContext ? createSSLContext () : null ;
247+ LayeredConnectionSocketFactory sslConnectionSocketFactory = sslContext == null ? new DummySSLConnectionSocketFactory ()
248+ : new SSLConnectionSocketFactory (sslContext );
247249 // Socket configuration
248250 SocketConfig .Builder soCfgBuilder = SocketConfig .custom ();
249251 MapUtils .applyInt (chConfiguration , ClientConfigProperties .SOCKET_OPERATION_TIMEOUT .getKey (),
@@ -287,9 +289,9 @@ public CloseableHttpClient createHttpClient() {
287289 // Connection manager
288290 boolean isConnectionPooling = MapUtils .getFlag (chConfiguration , "connection_pool_enabled" );
289291 if (isConnectionPooling ) {
290- clientBuilder .setConnectionManager (poolConnectionManager (sslContext , socketConfig ));
292+ clientBuilder .setConnectionManager (poolConnectionManager (sslConnectionSocketFactory , socketConfig ));
291293 } else {
292- clientBuilder .setConnectionManager (basicConnectionManager (sslContext , socketConfig ));
294+ clientBuilder .setConnectionManager (basicConnectionManager (sslConnectionSocketFactory , socketConfig ));
293295 }
294296 long keepAliveTimeout = MapUtils .getLong (chConfiguration , ClientConfigProperties .HTTP_KEEP_ALIVE_TIMEOUT .getKey ());
295297 if (keepAliveTimeout > 0 ) {
@@ -748,4 +750,26 @@ private String buildDefaultUserAgent() {
748750 public void close () {
749751 httpClient .close (CloseMode .IMMEDIATE );
750752 }
753+
754+
755+ /**
756+ * This factory is used only when no ssl connections are required (no https endpoints).
757+ * Internally http client would create factory and spend time if no supplied.
758+ */
759+ private static class DummySSLConnectionSocketFactory implements LayeredConnectionSocketFactory {
760+ @ Override
761+ public Socket createLayeredSocket (Socket socket , String target , int port , HttpContext context ) throws IOException {
762+ return null ;
763+ }
764+
765+ @ Override
766+ public Socket createSocket (HttpContext context ) throws IOException {
767+ return null ;
768+ }
769+
770+ @ Override
771+ public Socket connectSocket (TimeValue connectTimeout , Socket socket , HttpHost host , InetSocketAddress remoteAddress , InetSocketAddress localAddress , HttpContext context ) throws IOException {
772+ return null ;
773+ }
774+ }
751775}
0 commit comments