diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/ApacheHttpClientFactory.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/ApacheHttpClientFactory.java index cbd501b9..7ef38395 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/ApacheHttpClientFactory.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/ApacheHttpClientFactory.java @@ -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(); } diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientConnectionManagerFactory.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientConnectionManagerFactory.java index 92f12166..136ce607 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientConnectionManagerFactory.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientConnectionManagerFactory.java @@ -72,7 +72,6 @@ public class DefaultApacheHttpClientConnectionManagerFactory catch (KeyManagementException e) { LOG.warn("Error creating SSLContext", e); } - } final Registry registry = registryBuilder.build(); diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientFactory.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientFactory.java index 76d7a88c..66827bd8 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientFactory.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientFactory.java @@ -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(); } } diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultOkHttpClientFactory.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultOkHttpClientFactory.java index 0b0b61ae..7ea0aad8 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultOkHttpClientFactory.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultOkHttpClientFactory.java @@ -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; } } diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/HttpClientConfiguration.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/HttpClientConfiguration.java index f64ab8a0..f992ff17 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/HttpClientConfiguration.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/HttpClientConfiguration.java @@ -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 { diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/OkHttpClientFactory.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/OkHttpClientFactory.java index b7857e99..e4323ca0 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/OkHttpClientFactory.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/OkHttpClientFactory.java @@ -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. diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/CustomHttpClientConfigurationTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/CustomHttpClientConfigurationTests.java index 879e4010..51a1189d 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/CustomHttpClientConfigurationTests.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/CustomHttpClientConfigurationTests.java @@ -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(); } } diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientFactoryTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientFactoryTests.java index 1f31d632..3a69ea72 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientFactoryTests.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientFactoryTests.java @@ -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()); diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/DefaultOkHttpClientFactoryTest.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/DefaultOkHttpClientFactoryTest.java index 476caf21..10c40516 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/DefaultOkHttpClientFactoryTest.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/DefaultOkHttpClientFactoryTest.java @@ -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");