diff --git a/spring-credhub-core/src/main/java/org/springframework/credhub/configuration/ClientHttpRequestFactoryFactory.java b/spring-credhub-core/src/main/java/org/springframework/credhub/configuration/ClientHttpRequestFactoryFactory.java index 5225b55..ccf5067 100644 --- a/spring-credhub-core/src/main/java/org/springframework/credhub/configuration/ClientHttpRequestFactoryFactory.java +++ b/spring-credhub-core/src/main/java/org/springframework/credhub/configuration/ClientHttpRequestFactoryFactory.java @@ -19,6 +19,8 @@ package org.springframework.credhub.configuration; import java.io.IOException; import java.security.GeneralSecurityException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; @@ -26,9 +28,12 @@ import org.apache.http.impl.client.HttpClients; import org.springframework.credhub.support.ClientOptions; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; +import javax.net.ssl.SSLContext; + /** * Factory for {@link ClientHttpRequestFactory} that supports Apache HTTP Components, * OkHttp, Netty and the JDK HTTP client (in that order). This factory configures a @@ -38,6 +43,7 @@ import org.springframework.util.ClassUtils; * @author Scott Frederick */ public class ClientHttpRequestFactoryFactory { + private static final Log logger = LogFactory.getLog(ClientHttpRequestFactoryFactory.class); private static final boolean HTTP_COMPONENTS_PRESENT = ClassUtils.isPresent( "org.apache.http.client.HttpClient", @@ -56,36 +62,58 @@ public class ClientHttpRequestFactoryFactory { try { if (HTTP_COMPONENTS_PRESENT) { + logger.info("Using Apache HttpComponents HttpClient for HTTP connections"); return HttpComponents.usingHttpComponents(options); } } - catch (GeneralSecurityException e) { - throw new IllegalStateException(e); - } - catch (IOException e) { - throw new IllegalStateException(e); + catch (Exception e) { + logger.warn("Exception caught while configuring HTTP connections", e); } - throw new IllegalStateException("Only Apache HTTP Components is supported."); + logger.info("Defaulting to java.net.HttpUrlConnection for HTTP connections"); + return HttpURLConnection.usingJdk(options); } /** - * {@link ClientHttpRequestFactory} for Apache HttpComponents. + * {@link ClientHttpRequestFactory} using {@link java.net.HttpURLConnection}. + */ + static class HttpURLConnection { + static ClientHttpRequestFactory usingJdk(ClientOptions options) { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + + if (options.getConnectionTimeout() != null) { + factory.setConnectTimeout(options.getConnectionTimeout()); + } + if (options.getReadTimeout() != null) { + factory.setReadTimeout(options.getReadTimeout()); + } + + return factory; + } + } + + /** + * {@link ClientHttpRequestFactory} using Apache HttpComponents. */ static class HttpComponents { - static ClientHttpRequestFactory usingHttpComponents(ClientOptions options) throws GeneralSecurityException, IOException { - HttpClientBuilder httpClientBuilder = HttpClients.custom(); + HttpClientBuilder httpClientBuilder = HttpClients.custom() + .setSSLContext(SSLContext.getDefault()) + .useSystemProperties(); - RequestConfig requestConfig = RequestConfig.custom() - .setConnectTimeout(options.getConnectionTimeout()) - .setSocketTimeout(options.getReadTimeout()) - .setAuthenticationEnabled(true) - .build(); + RequestConfig.Builder requestConfigBuilder = RequestConfig.custom() + .setAuthenticationEnabled(true); - httpClientBuilder.setDefaultRequestConfig(requestConfig); + if (options.getConnectionTimeout() != null) { + requestConfigBuilder.setConnectTimeout(options.getConnectionTimeout()); + } + if (options.getReadTimeout() != null) { + requestConfigBuilder.setSocketTimeout(options.getReadTimeout()); + } + + httpClientBuilder.setDefaultRequestConfig(requestConfigBuilder.build()); return new HttpComponentsClientHttpRequestFactory(httpClientBuilder.build()); } diff --git a/spring-credhub-core/src/main/java/org/springframework/credhub/support/ClientOptions.java b/spring-credhub-core/src/main/java/org/springframework/credhub/support/ClientOptions.java index 0d5ebbd..112d141 100644 --- a/spring-credhub-core/src/main/java/org/springframework/credhub/support/ClientOptions.java +++ b/spring-credhub-core/src/main/java/org/springframework/credhub/support/ClientOptions.java @@ -29,20 +29,19 @@ public class ClientOptions { /** * Connection timeout; */ - private final int connectionTimeout; + private final Integer connectionTimeout; /** * Read timeout; */ - private final int readTimeout; + private final Integer readTimeout; /** - * Create new {@link ClientOptions} with default timeouts of {@literal 5} - * {@link TimeUnit#SECONDS} connection timeout and {@literal 15} - * {@link TimeUnit#SECONDS} read timeout. + * Create new {@link ClientOptions} with default timeouts. */ public ClientOptions() { - this((int) TimeUnit.SECONDS.toMillis(5), (int) TimeUnit.SECONDS.toMillis(15)); + this.connectionTimeout = null; + this.readTimeout = null; } /** @@ -59,20 +58,20 @@ public class ClientOptions { } /** - * Gets the connection timeout in {@link TimeUnit#MILLISECONDS}. + * Get the connection timeout in {@link TimeUnit#MILLISECONDS}. * - * @return the connection timeout + * @return the connection timeout; can be {@literal null if not explicitly set} */ - public int getConnectionTimeout() { + public Integer getConnectionTimeout() { return connectionTimeout; } /** - * Gets the read timeout in {@link TimeUnit#MILLISECONDS} + * Get the read timeout in {@link TimeUnit#MILLISECONDS}. * - * @return the read timeout + * @return the read timeout; can be {@literal null if not explicitly set} */ - public int getReadTimeout() { + public Integer getReadTimeout() { return readTimeout; } diff --git a/spring-credhub-core/src/test/java/org/springframework/credhub/configuration/ClientHttpRequestFactoryFactoryTests.java b/spring-credhub-core/src/test/java/org/springframework/credhub/configuration/ClientHttpRequestFactoryFactoryTests.java index 851af2c..b67dbdd 100644 --- a/spring-credhub-core/src/test/java/org/springframework/credhub/configuration/ClientHttpRequestFactoryFactoryTests.java +++ b/spring-credhub-core/src/test/java/org/springframework/credhub/configuration/ClientHttpRequestFactoryFactoryTests.java @@ -24,13 +24,22 @@ import org.springframework.beans.factory.DisposableBean; import org.springframework.credhub.support.ClientOptions; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertThat; import static org.springframework.credhub.configuration.ClientHttpRequestFactoryFactory.HttpComponents.usingHttpComponents; +import static org.springframework.credhub.configuration.ClientHttpRequestFactoryFactory.HttpURLConnection.usingJdk; public class ClientHttpRequestFactoryFactoryTests { + @Test + public void jdkDefaultClientCreated() throws Exception { + ClientHttpRequestFactory factory = usingJdk(new ClientOptions()); + + assertThat(factory, instanceOf(SimpleClientHttpRequestFactory.class)); + } + @Test public void httpComponentsClientCreated() throws Exception { @@ -38,8 +47,7 @@ public class ClientHttpRequestFactoryFactoryTests { assertThat(factory, instanceOf(HttpComponentsClientHttpRequestFactory.class)); - HttpClient httpClient = ((HttpComponentsClientHttpRequestFactory) factory) - .getHttpClient(); + HttpClient httpClient = ((HttpComponentsClientHttpRequestFactory) factory).getHttpClient(); assertThat(httpClient, instanceOf(CloseableHttpClient.class)); diff --git a/spring-credhub-demo/pom.xml b/spring-credhub-demo/pom.xml index 17471f3..c32564d 100644 --- a/spring-credhub-demo/pom.xml +++ b/spring-credhub-demo/pom.xml @@ -52,10 +52,6 @@ spring-credhub-core 1.0.0.BUILD-SNAPSHOT - - org.apache.httpcomponents - httpclient - org.springframework.boot diff --git a/spring-credhub-demo/src/main/java/org/springframework/credhub/demo/CredHubDemoController.java b/spring-credhub-demo/src/main/java/org/springframework/credhub/demo/CredHubDemoController.java index c003415..cc95b82 100644 --- a/spring-credhub-demo/src/main/java/org/springframework/credhub/demo/CredHubDemoController.java +++ b/spring-credhub-demo/src/main/java/org/springframework/credhub/demo/CredHubDemoController.java @@ -56,20 +56,24 @@ public class CredHubDemoController { public Results runTests(@RequestBody Map value) { Results results = new Results(); - CredentialDetails credentialDetails = writeCredentials(value, results); - CredentialName credentialName = credentialDetails.getName(); + try { + CredentialDetails credentialDetails = writeCredentials(value, results); + CredentialName credentialName = credentialDetails.getName(); - getCredentialsById(credentialDetails.getId(), results); + getCredentialsById(credentialDetails.getId(), results); - getCredentialsByName(credentialName, results); + getCredentialsByName(credentialName, results); - findCredentialsByName(credentialName, results); + findCredentialsByName(credentialName, results); - findCredentialsByPath(credentialName.getName(), results); + findCredentialsByPath(credentialName.getName(), results); - interpolateServiceData(credentialName, results); + interpolateServiceData(credentialName, results); - deleteCredentials(credentialName, results); + deleteCredentials(credentialName, results); + } catch (Exception e) { + saveResults(results, "Exception caught: " + e.getMessage()); + } return results; }