Browse Source

Use a builder pattern to create clients.

pull/222/head
Ryan Baxter 8 years ago
parent
commit
08c0c01774
  1. 11
      spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/ApacheHttpClientFactory.java
  2. 1
      spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientConnectionManagerFactory.java
  3. 12
      spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientFactory.java
  4. 16
      spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultOkHttpClientFactory.java
  5. 2
      spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/HttpClientConfiguration.java
  6. 19
      spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/OkHttpClientFactory.java
  7. 15
      spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/CustomHttpClientConfigurationTests.java
  8. 6
      spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientFactoryTests.java
  9. 7
      spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/DefaultOkHttpClientFactoryTest.java

11
spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/ApacheHttpClientFactory.java

@ -21,6 +21,7 @@ package org.springframework.cloud.commons.httpclient; @@ -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; @@ -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();
}

1
spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientConnectionManagerFactory.java

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

12
spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientFactory.java

@ -11,11 +11,13 @@ import org.apache.http.impl.client.HttpClientBuilder; @@ -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();
}
}

16
spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/DefaultOkHttpClientFactory.java

@ -22,15 +22,8 @@ public class DefaultOkHttpClientFactory implements OkHttpClientFactory { @@ -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 { @@ -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;
}
}

2
spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/HttpClientConfiguration.java

@ -32,7 +32,7 @@ public class HttpClientConfiguration { @@ -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 {

19
spring-cloud-commons/src/main/java/org/springframework/cloud/commons/httpclient/OkHttpClientFactory.java

@ -18,22 +18,11 @@ import javax.net.ssl.X509TrustManager; @@ -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.

15
spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/CustomHttpClientConfigurationTests.java

@ -6,10 +6,12 @@ import okhttp3.OkHttpClient; @@ -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 { @@ -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 { @@ -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
spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/DefaultApacheHttpClientFactoryTests.java

@ -6,6 +6,7 @@ import org.apache.http.client.config.RequestConfig; @@ -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 { @@ -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());

7
spring-cloud-commons/src/test/java/org/springframework/cloud/commons/httpclient/DefaultOkHttpClientFactoryTest.java

@ -21,8 +21,11 @@ public class DefaultOkHttpClientFactoryTest { @@ -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");

Loading…
Cancel
Save