static ClientHttpRequestFactory usingHttpComponents()

in common/src/main/java/org/jetbrains/teamcity/vault/support/ClientHttpRequestFactoryFactory.java [81:124]


        static ClientHttpRequestFactory usingHttpComponents(@NotNull ClientOptions options,
                                                            @Nullable SSLTrustStoreProvider trustStoreProvider) throws GeneralSecurityException {

            HttpClientBuilder httpClientBuilder = HttpClients.custom();

            httpClientBuilder.setRoutePlanner(new SystemDefaultRoutePlanner(
                    DefaultSchemePortResolver.INSTANCE, ProxySelector.getDefault()));

            KeyStore trustStore = trustStoreProvider != null ? trustStoreProvider.getTrustStore() : null;

            if (trustStore != null) {
                SSLContext sslContext = SSLContextUtil.createUserSSLContext(trustStore);
                if (sslContext == null) {
                    throw new GeneralSecurityException("Error creating extended trusted SSL certificates store");
                }
                SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext);
                httpClientBuilder.setSSLSocketFactory(sslSocketFactory);
                httpClientBuilder.setSslcontext(sslContext);
            }

            RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout((int) options.getConnectionTimeout().toMillis())
                    .setSocketTimeout((int) options.getReadTimeout().toMillis())
                    .setAuthenticationEnabled(true)
                    .build();

            httpClientBuilder.setDefaultRequestConfig(requestConfig);

            // Support redirects
            httpClientBuilder.setRedirectStrategy(new LaxRedirectStrategy());

            // Fix weird problem `ProtocolException: Content-Length header already present` from `org.apache.http.protocol.RequestContent`
            httpClientBuilder.addInterceptorFirst(new HttpRequestInterceptor() {
                @Override
                public void process(HttpRequest request, HttpContext context) {
                    if (request instanceof HttpEntityEnclosingRequest) {
                        request.removeHeaders(HTTP.TRANSFER_ENCODING);
                        request.removeHeaders(HTTP.CONTENT_LEN);
                    }
                }
            });

            return new HttpComponentsClientHttpRequestFactory(httpClientBuilder.build());
        }