001/*-
002 * #%L
003 * Smile CDR - CDR
004 * %%
005 * Copyright (C) 2016 - 2025 Smile CDR, Inc.
006 * %%
007 * All rights reserved.
008 * #L%
009 */
010package ca.cdr.test.app.clients.common;
011
012import jakarta.annotation.Nonnull;
013import org.apache.hc.client5.http.config.ConnectionConfig;
014import org.apache.hc.client5.http.config.RequestConfig;
015import org.apache.hc.client5.http.cookie.BasicCookieStore;
016import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
017import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
018import org.apache.hc.client5.http.socket.ConnectionSocketFactory;
019import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory;
020import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
021import org.apache.hc.core5.http.URIScheme;
022import org.apache.hc.core5.http.config.Registry;
023import org.apache.hc.core5.http.config.RegistryBuilder;
024import org.apache.hc.core5.pool.PoolConcurrencyPolicy;
025import org.apache.hc.core5.pool.PoolReusePolicy;
026import org.apache.hc.core5.util.TimeValue;
027import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
028
029import java.util.concurrent.TimeUnit;
030
031public class RequestFactoryUtil {
032
033        /**
034         * Set a massive timeout
035         * Disable Redirects.
036         * Set up local cookie storage.
037         */
038        public static @Nonnull HttpComponentsClientHttpRequestFactory buildSmileRequestFactory() {
039                Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
040                        .register(URIScheme.HTTP.id, PlainConnectionSocketFactory.getSocketFactory())
041                        .register(URIScheme.HTTPS.id, SSLConnectionSocketFactory.getSocketFactory())
042                        .build();
043
044                TimeValue ttl = TimeValue.of(5, TimeUnit.SECONDS);
045
046                ConnectionConfig connectionConfig = ConnectionConfig.custom()
047                        .setConnectTimeout(10, TimeUnit.MINUTES)
048                        .setSocketTimeout(10, TimeUnit.MINUTES)
049                        .build();
050
051                PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(
052                        socketFactoryRegistry, PoolConcurrencyPolicy.LAX, PoolReusePolicy.LIFO, ttl);
053                connectionManager.setMaxTotal(99);
054                connectionManager.setDefaultMaxPerRoute(99);
055                connectionManager.setDefaultConnectionConfig(connectionConfig);
056
057                HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
058                BasicCookieStore cookieStore = new BasicCookieStore();
059                httpClientBuilder.setDefaultCookieStore(cookieStore);
060                httpClientBuilder.disableRedirectHandling();
061                httpClientBuilder.setConnectionManager(connectionManager);
062
063                RequestConfig requestConfig = RequestConfig.custom()
064                        .setConnectionRequestTimeout(600000, TimeUnit.MILLISECONDS)
065                        .build();
066                httpClientBuilder.setDefaultRequestConfig(requestConfig);
067
068                HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClientBuilder.build());
069                return requestFactory;
070        }}