'create HttpClient using useSystemProperties()

I am trying to create one http client using useSystemProperties() as i need to default the ssl properties to that of WAS [like to get the WAS ciphers in runtime ]. And I have to set some max connections and connection manager also to the httpclient. This is a very high traffic rest call.

I have tried 3 ways,

 -- This did not set the WAS ssl properties and thus the connection got failed.
httpclient = HttpClients.custom().useSystemProperties()
                        .setConnectionManager("some value")
                        .setMaxConnPerRoute("some value")
                        .setMaxConnTotal("some value")
                        .setUserAgent("Custom Browser")
                        .disableCookieManagement().build();

 -- This did not set the WAS ssl properties and thus the connection failed.
httpclient1 = HttpClientBuilder.create().useSystemProperties()
                               .setConnectionManager(connManager)
                               .setMaxConnPerRoute(maxConnPerRoute)
                               .setMaxConnTotal(maxConnTotal)
                               .setUserAgent("Custom Browser")
                               .disableCookieManagement().build();

-- This one defaulted to WAS ssl configurations and connection was fine but other params are missing here.
httpclient2 = HttpClientBuilder.create().useSystemProperties().build();

Can I really achieve both these options?



Solution 1:[1]

You would need to override the SSLConnectionSocketFactory for your ConnectionManager, for example, on the example below will be created default SSLConnectionSocketFactory if you would use useSystemProperties

    DefaultHostnameVerifier hostnameVerifier = new DefaultHostnameVerifier(PublicSuffixMatcherLoader.getDefault());
    SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
            (SSLSocketFactory) SSLSocketFactory.getDefault(), null, null, hostnameVerifier
    );

    final PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(
            RegistryBuilder.<ConnectionSocketFactory>create()
                    .register("http", PlainConnectionSocketFactory.getSocketFactory())
                    .register("https", sslConnectionSocketFactory)
                    .build()
    );

    connManager.setDefaultMaxPerRoute(20);
    connManager.setMaxTotal(20);


    final HttpClientBuilder builder = HttpClientBuilder
            .create()
            .setConnectionManager(connManager);

Solution 2:[2]

You can also set useSystemProperties() as below to your HttpClient:

HttpClient httpClient = HttpClientBuilder.create()
            .setConnectionManager(connectionManager)
            .useSystemProperties()
            .setDefaultRequestConfig(requestConfig).build();

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Mr. Skip
Solution 2 Dada