Use a builder pattern to create clients.

This commit is contained in:
Ryan Baxter
2017-07-09 13:35:05 -04:00
parent a375cb40f4
commit 08c0c01774
9 changed files with 34 additions and 55 deletions

View File

@@ -21,6 +21,7 @@ package org.springframework.cloud.commons.httpclient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
/**
* Factory for creating a new {@link CloseableHttpClient}.
@@ -29,12 +30,8 @@ import org.apache.http.impl.client.CloseableHttpClient;
public interface ApacheHttpClientFactory {
/**
* Creates a new {@link CloseableHttpClient}.
* @param requestConfig Configuration to be used for all requests by default
* @param connectionManager The {@link HttpClientConnectionManager} to use for the
* client
* @return A new {@link CloseableHttpClient}
* Creates an {@link HttpClientBuilder} that can be used to create a new {@link CloseableHttpClient}.
* @return A {@link HttpClientBuilder}
*/
public CloseableHttpClient createClient(RequestConfig requestConfig,
HttpClientConnectionManager connectionManager);
public HttpClientBuilder createBuilder();
}

View File

@@ -72,7 +72,6 @@ public class DefaultApacheHttpClientConnectionManagerFactory
catch (KeyManagementException e) {
LOG.warn("Error creating SSLContext", e);
}
}
final Registry<ConnectionSocketFactory> registry = registryBuilder.build();

View File

@@ -11,11 +11,13 @@ import org.apache.http.impl.client.HttpClientBuilder;
*/
public class DefaultApacheHttpClientFactory implements ApacheHttpClientFactory {
public CloseableHttpClient createClient(RequestConfig requestConfig,
HttpClientConnectionManager connectionManager) {
/**
* A default {@link HttpClientBuilder}. The {@link HttpClientBuilder} returned will
* have content compression disabled, cookie management disabled, and use system properties.
*/
@Override
public HttpClientBuilder createBuilder() {
return HttpClientBuilder.create().disableContentCompression()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(connectionManager).disableCookieManagement()
.useSystemProperties().build();
.disableCookieManagement().useSystemProperties();
}
}

View File

@@ -22,15 +22,8 @@ public class DefaultOkHttpClientFactory implements OkHttpClientFactory {
private static final Log LOG = LogFactory.getLog(DefaultOkHttpClientFactory.class);
@Override
public OkHttpClient create(boolean disableSslValidation, long connectTimeout,
TimeUnit connectTimeoutUnit, boolean followRedirects, long readTimeout,
TimeUnit readTimeoutUnit, ConnectionPool connectionPool,
SSLSocketFactory sslSocketFactory, X509TrustManager x509TrustManager) {
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(connectTimeout, connectTimeoutUnit)
.followRedirects(followRedirects)
.readTimeout(readTimeout, readTimeoutUnit).connectionPool(connectionPool)
.connectionPool(connectionPool);
public OkHttpClient.Builder createBuilder(boolean disableSslValidation) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
if (disableSslValidation) {
try {
X509TrustManager disabledTrustManager = new DisableValidationTrustManager();
@@ -49,9 +42,6 @@ public class DefaultOkHttpClientFactory implements OkHttpClientFactory {
LOG.warn("Error setting SSLSocketFactory in OKHttpClient", e);
}
}
if (sslSocketFactory != null && x509TrustManager != null) {
builder.sslSocketFactory(sslSocketFactory, x509TrustManager);
}
return builder.build();
return builder;
}
}

View File

@@ -32,7 +32,7 @@ public class HttpClientConfiguration {
}
@Configuration
@ConditionalOnProperty(name = "spring.cloud.httpclient.ok.enabled")
@ConditionalOnProperty(name = "spring.cloud.httpclient.ok.enabled", matchIfMissing = true)
@ConditionalOnClass(OkHttpClient.class)
static class OkHttpClientConfiguration {

View File

@@ -18,22 +18,11 @@ import javax.net.ssl.X509TrustManager;
public interface OkHttpClientFactory {
/**
* Creates a new {@link OkHttpClient}.
* @param disableSslValidation To disable SSL validation
* @param connectTimeout Connection timeout duration
* @param connectTimeoutUnit Connection timeout time unit
* @param followRedirects Whether to follow redirects
* @param readTimeout Read timeout duration
* @param readTimeoutUnit Read timeout time unit
* @param connectionPool The connection pool to use
* @param sslSocketFactory The socket factory to use, can be {@code null}
* @param x509TrustManager The trust manager to use, can be {@code null}
* @return A new {@link OkHttpClient}
* Creates a {@link OkHttpClient.Builder} used to build an {@link OkHttpClient}.
* @param disableSslValidation Disables SSL validation
* @return A new {@link OkHttpClient.Builder}
*/
public OkHttpClient create(boolean disableSslValidation, long connectTimeout,
TimeUnit connectTimeoutUnit, boolean followRedirects, long readTimeout,
TimeUnit readTimeoutUnit, ConnectionPool connectionPool,
SSLSocketFactory sslSocketFactory, X509TrustManager x509TrustManager);
public OkHttpClient.Builder createBuilder(boolean disableSslValidation);
/**
* A {@link X509TrustManager} that does not validate SSL certificates.

View File

@@ -6,10 +6,12 @@ import okhttp3.OkHttpClient;
import java.util.concurrent.TimeUnit;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.X509TrustManager;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
@@ -106,9 +108,8 @@ class CustomApplication {
static class MyApacheHttpClientFactory implements ApacheHttpClientFactory {
@Override
public CloseableHttpClient createClient(RequestConfig requestConfig,
HttpClientConnectionManager connectionManager) {
return null;
public HttpClientBuilder createBuilder() {
return HttpClientBuilder.create();
}
}
@@ -125,13 +126,9 @@ class CustomApplication {
}
static class MyOkHttpClientFactory implements OkHttpClientFactory {
@Override
public OkHttpClient create(boolean disableSslValidation, long connectTimeout,
TimeUnit connectTimeoutUnit, boolean followRedirects, long readTimeout,
TimeUnit readTimeoutUnit, ConnectionPool connectionPool,
SSLSocketFactory sslSocketFactory, X509TrustManager x509TrustManager) {
return null;
public OkHttpClient.Builder createBuilder(boolean disableSslValidation) {
return new OkHttpClient.Builder();
}
}

View File

@@ -6,6 +6,7 @@ import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.Configurable;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.springframework.util.ReflectionUtils;
@@ -21,8 +22,9 @@ public class DefaultApacheHttpClientFactoryTests {
public void createClient() throws Exception {
final RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(100)
.setConnectTimeout(200).setCookieSpec(CookieSpecs.IGNORE_COOKIES).build();
CloseableHttpClient httpClient = new DefaultApacheHttpClientFactory()
.createClient(requestConfig, mock(HttpClientConnectionManager.class));
CloseableHttpClient httpClient = new DefaultApacheHttpClientFactory().createBuilder().
setConnectionManager(mock(HttpClientConnectionManager.class)).
setDefaultRequestConfig(requestConfig).build();
Assertions.assertThat(httpClient).isInstanceOf(Configurable.class);
RequestConfig config = ((Configurable) httpClient).getConfig();
assertEquals(100, config.getSocketTimeout());

View File

@@ -21,8 +21,11 @@ public class DefaultOkHttpClientFactoryTest {
DefaultOkHttpClientFactory okHttpClientFactory = new DefaultOkHttpClientFactory();
DefaultOkHttpClientConnectionPoolFactory poolFactory = new DefaultOkHttpClientConnectionPoolFactory();
ConnectionPool pool = poolFactory.create(4, 5, TimeUnit.DAYS);
OkHttpClient httpClient = okHttpClientFactory.create(true, 2,
TimeUnit.MILLISECONDS, true, 3, TimeUnit.HOURS, pool, null, null);
OkHttpClient httpClient = okHttpClientFactory.createBuilder(true).
connectTimeout(2, TimeUnit.MILLISECONDS).
readTimeout(3, TimeUnit.HOURS).
followRedirects(true).
connectionPool(pool).build();
int connectTimeout = getField(httpClient, "connectTimeout");
assertEquals(2, connectTimeout);
int readTimeout = getField(httpClient, "readTimeout");