Use a builder pattern to create clients.
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -72,7 +72,6 @@ public class DefaultApacheHttpClientConnectionManagerFactory
|
||||
catch (KeyManagementException e) {
|
||||
LOG.warn("Error creating SSLContext", e);
|
||||
}
|
||||
|
||||
}
|
||||
final Registry<ConnectionSocketFactory> registry = registryBuilder.build();
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user