33import com .clickhouse .client .ClickHouseNode ;
44import com .clickhouse .client .ClickHouseSslContextProvider ;
55import com .clickhouse .client .api .Client ;
6+ import com .clickhouse .client .api .ClientConfigProperties ;
67import com .clickhouse .client .api .ClientException ;
78import com .clickhouse .client .api .ClientFaultCause ;
89import com .clickhouse .client .api .ClientMisconfigurationException ;
9- import com .clickhouse .client .api .ClientConfigProperties ;
1010import com .clickhouse .client .api .ConnectionInitiationException ;
1111import com .clickhouse .client .api .ConnectionReuseStrategy ;
1212import com .clickhouse .client .api .ServerException ;
2525import org .apache .hc .client5 .http .io .HttpClientConnectionManager ;
2626import org .apache .hc .client5 .http .protocol .HttpClientContext ;
2727import org .apache .hc .client5 .http .socket .ConnectionSocketFactory ;
28+ import org .apache .hc .client5 .http .socket .LayeredConnectionSocketFactory ;
2829import org .apache .hc .client5 .http .socket .PlainConnectionSocketFactory ;
2930import org .apache .hc .client5 .http .ssl .SSLConnectionSocketFactory ;
3031import org .apache .hc .core5 .http .ClassicHttpResponse ;
4344import org .apache .hc .core5 .http .impl .io .DefaultHttpResponseParserFactory ;
4445import org .apache .hc .core5 .http .io .SocketConfig ;
4546import org .apache .hc .core5 .http .io .entity .EntityTemplate ;
47+ import org .apache .hc .core5 .http .protocol .HttpContext ;
4648import org .apache .hc .core5 .io .CloseMode ;
4749import org .apache .hc .core5 .io .IOCallback ;
4850import org .apache .hc .core5 .net .URIBuilder ;
6062import java .net .ConnectException ;
6163import java .net .InetSocketAddress ;
6264import java .net .NoRouteToHostException ;
65+ import java .net .Socket ;
6366import java .net .SocketTimeoutException ;
6467import java .net .URI ;
6568import java .net .URISyntaxException ;
@@ -93,9 +96,9 @@ public class HttpAPIClientHelper {
9396
9497 private String defaultUserAgent ;
9598
96- public HttpAPIClientHelper (Map <String , String > configuration ) {
99+ public HttpAPIClientHelper (Map <String , String > configuration , boolean initSslContext ) {
97100 this .chConfiguration = configuration ;
98- this .httpClient = createHttpClient ();
101+ this .httpClient = createHttpClient (initSslContext );
99102
100103 RequestConfig .Builder reqConfBuilder = RequestConfig .custom ();
101104 MapUtils .applyLong (chConfiguration , "connection_request_timeout" ,
@@ -170,11 +173,10 @@ private ConnectionConfig createConnectionConfig() {
170173 return connConfig .build ();
171174 }
172175
173- private HttpClientConnectionManager basicConnectionManager (SSLContext sslContext , SocketConfig socketConfig ) {
176+ private HttpClientConnectionManager basicConnectionManager (LayeredConnectionSocketFactory sslConnectionSocketFactory , SocketConfig socketConfig ) {
174177 RegistryBuilder <ConnectionSocketFactory > registryBuilder = RegistryBuilder .create ();
175178 registryBuilder .register ("http" , PlainConnectionSocketFactory .getSocketFactory ());
176- registryBuilder .register ("https" , new SSLConnectionSocketFactory (sslContext ));
177-
179+ registryBuilder .register ("https" , sslConnectionSocketFactory );
178180
179181 BasicHttpClientConnectionManager connManager = new BasicHttpClientConnectionManager (registryBuilder .build ());
180182 connManager .setConnectionConfig (createConnectionConfig ());
@@ -183,7 +185,7 @@ private HttpClientConnectionManager basicConnectionManager(SSLContext sslContext
183185 return connManager ;
184186 }
185187
186- private HttpClientConnectionManager poolConnectionManager (SSLContext sslContext , SocketConfig socketConfig ) {
188+ private HttpClientConnectionManager poolConnectionManager (LayeredConnectionSocketFactory sslConnectionSocketFactory , SocketConfig socketConfig ) {
187189 PoolingHttpClientConnectionManagerBuilder connMgrBuilder = PoolingHttpClientConnectionManagerBuilder .create ()
188190 .setPoolConcurrencyPolicy (PoolConcurrencyPolicy .LAX );
189191
@@ -217,17 +219,17 @@ private HttpClientConnectionManager poolConnectionManager(SSLContext sslContext,
217219 DefaultHttpResponseParserFactory .INSTANCE );
218220
219221 connMgrBuilder .setConnectionFactory (connectionFactory );
220- connMgrBuilder .setSSLSocketFactory (new SSLConnectionSocketFactory ( sslContext ) );
222+ connMgrBuilder .setSSLSocketFactory (sslConnectionSocketFactory );
221223 connMgrBuilder .setDefaultSocketConfig (socketConfig );
222224 return connMgrBuilder .build ();
223225 }
224226
225- public CloseableHttpClient createHttpClient () {
226-
227+ public CloseableHttpClient createHttpClient (boolean initSslContext ) {
227228 // Top Level builders
228229 HttpClientBuilder clientBuilder = HttpClientBuilder .create ();
229- SSLContext sslContext = createSSLContext ();
230-
230+ SSLContext sslContext = initSslContext ? createSSLContext () : null ;
231+ LayeredConnectionSocketFactory sslConnectionSocketFactory = sslContext == null ? new DummySSLConnectionSocketFactory ()
232+ : new SSLConnectionSocketFactory (sslContext );
231233 // Socket configuration
232234 SocketConfig .Builder soCfgBuilder = SocketConfig .custom ();
233235 MapUtils .applyInt (chConfiguration , ClientConfigProperties .SOCKET_OPERATION_TIMEOUT .getKey (),
@@ -271,9 +273,9 @@ public CloseableHttpClient createHttpClient() {
271273 // Connection manager
272274 boolean isConnectionPooling = MapUtils .getFlag (chConfiguration , "connection_pool_enabled" );
273275 if (isConnectionPooling ) {
274- clientBuilder .setConnectionManager (poolConnectionManager (sslContext , socketConfig ));
276+ clientBuilder .setConnectionManager (poolConnectionManager (sslConnectionSocketFactory , socketConfig ));
275277 } else {
276- clientBuilder .setConnectionManager (basicConnectionManager (sslContext , socketConfig ));
278+ clientBuilder .setConnectionManager (basicConnectionManager (sslConnectionSocketFactory , socketConfig ));
277279 }
278280 long keepAliveTimeout = MapUtils .getLong (chConfiguration , ClientConfigProperties .HTTP_KEEP_ALIVE_TIMEOUT .getKey ());
279281 if (keepAliveTimeout > 0 ) {
@@ -713,4 +715,26 @@ private String buildDefaultUserAgent() {
713715 public void close () {
714716 httpClient .close (CloseMode .IMMEDIATE );
715717 }
718+
719+
720+ /**
721+ * This factory is used only when no ssl connections are required (no https endpoints).
722+ * Internally http client would create factory and spend time if no supplied.
723+ */
724+ private static class DummySSLConnectionSocketFactory implements LayeredConnectionSocketFactory {
725+ @ Override
726+ public Socket createLayeredSocket (Socket socket , String target , int port , HttpContext context ) throws IOException {
727+ return null ;
728+ }
729+
730+ @ Override
731+ public Socket createSocket (HttpContext context ) throws IOException {
732+ return null ;
733+ }
734+
735+ @ Override
736+ public Socket connectSocket (TimeValue connectTimeout , Socket socket , HttpHost host , InetSocketAddress remoteAddress , InetSocketAddress localAddress , HttpContext context ) throws IOException {
737+ return null ;
738+ }
739+ }
716740}
0 commit comments