All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.statful.client.transport.SSLClientFactory Maven / Gradle / Ivy

package com.statful.client.transport;

import com.statful.client.domain.api.ClientConfiguration;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContexts;

import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;

/**
 * A factory for HTTP clients to communicate with Statful using SSL (it also supports non-secure communications).
 */
public class SSLClientFactory implements HTTPClientFactory {

    private final String token;
    private final int connectionPoolSize;
    private final int connectTimeoutMs;
    private final int socketTimeoutMs;

    /**
     * Default constructor.
     *
     * @param connectionPoolSize The connection pool size
     * @param connectTimeoutMs The connect timeout in milliseconds
     * @param socketTimeoutMs The socket timeout in milliseconds
     * @param token The Statful authentication token
     */
    public SSLClientFactory(final int connectionPoolSize, final int connectTimeoutMs, final int socketTimeoutMs, final String token) {
        this.connectionPoolSize = connectionPoolSize;
        this.connectTimeoutMs = connectTimeoutMs;
        this.socketTimeoutMs = socketTimeoutMs;
        this.token = token;
    }

    @Override
    public final CloseableHttpClient createHttpClient() throws GeneralSecurityException {
        return HttpClients.custom()
                .setConnectionManager(createConnectionManager(connectionPoolSize))
                .setSSLSocketFactory(createSslSocketFactory())
                .build();
    }

    private static PoolingHttpClientConnectionManager createConnectionManager(final int connectionPoolSize) {
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        connectionManager.setMaxTotal(connectionPoolSize);
        connectionManager.setDefaultMaxPerRoute(connectionPoolSize);

        return connectionManager;

    }

    private static SSLConnectionSocketFactory createSslSocketFactory() throws GeneralSecurityException {
        return new SSLConnectionSocketFactory(
                SSLContexts.createSystemDefault(),
                new String[] {
                        "TLSv1", "TLSv2"
                },
                null,
                SSLConnectionSocketFactory.getDefaultHostnameVerifier());
    }

    @Override
    public final HttpPut createHttpPut(final String uri, final String body) throws UnsupportedEncodingException {
        HttpPut httpPut = new HttpPut(uri);
        httpPut.addHeader(ClientConfiguration.TOKEN_HEADER, token);
        httpPut.setEntity(new StringEntity(body));
        httpPut.setConfig(RequestConfig.copy(RequestConfig.DEFAULT)
                .setConnectTimeout(connectTimeoutMs)
                .setConnectionRequestTimeout(connectTimeoutMs)
                .setSocketTimeout(socketTimeoutMs)
                .build());

        return httpPut;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy