From 65494e4e63c099edc5bc0e56f845929e2f484a0c Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 14 Dec 2016 11:30:22 +0100 Subject: [PATCH] Add support for OkHttp 3. Fixes gh-39. --- spring-vault-core/pom.xml | 6 +++ .../ClientHttpRequestFactoryFactory.java | 37 ++++++++++++++++++- ...RequestFactoryFactoryIntegrationTests.java | 17 +++++++++ spring-vault-dependencies/pom.xml | 8 ++++ 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/spring-vault-core/pom.xml b/spring-vault-core/pom.xml index 4dd2fd20..db82ff9b 100644 --- a/spring-vault-core/pom.xml +++ b/spring-vault-core/pom.xml @@ -57,6 +57,12 @@ true + + com.squareup.okhttp3 + okhttp + true + + org.springframework spring-test diff --git a/spring-vault-core/src/main/java/org/springframework/vault/config/ClientHttpRequestFactoryFactory.java b/spring-vault-core/src/main/java/org/springframework/vault/config/ClientHttpRequestFactoryFactory.java index 10db97af..18aad6ed 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/config/ClientHttpRequestFactoryFactory.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/config/ClientHttpRequestFactoryFactory.java @@ -21,6 +21,7 @@ import java.security.GeneralSecurityException; import java.security.KeyStore; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; +import java.util.concurrent.TimeUnit; import javax.net.ssl.KeyManager; import javax.net.ssl.KeyManagerFactory; @@ -31,6 +32,7 @@ import javax.net.ssl.TrustManagerFactory; import com.squareup.okhttp.OkHttpClient; import io.netty.handler.ssl.SslContextBuilder; import io.netty.handler.ssl.SslProvider; +import okhttp3.OkHttpClient.Builder; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.http.client.config.RequestConfig; @@ -42,6 +44,7 @@ import org.springframework.core.io.Resource; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.client.Netty4ClientHttpRequestFactory; +import org.springframework.http.client.OkHttp3ClientHttpRequestFactory; import org.springframework.http.client.OkHttpClientHttpRequestFactory; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.util.Assert; @@ -70,6 +73,10 @@ public class ClientHttpRequestFactoryFactory { "com.squareup.okhttp.OkHttpClient", ClientHttpRequestFactoryFactory.class.getClassLoader()); + private static final boolean OKHTTP3_PRESENT = ClassUtils.isPresent( + "okhttp3.OkHttpClient", + ClientHttpRequestFactoryFactory.class.getClassLoader()); + private static final boolean NETTY_PRESENT = ClassUtils.isPresent( "io.netty.channel.nio.NioEventLoopGroup", ClientHttpRequestFactoryFactory.class.getClassLoader()); @@ -95,6 +102,10 @@ public class ClientHttpRequestFactoryFactory { return HttpComponents.usingHttpComponents(options, sslConfiguration); } + if (OKHTTP3_PRESENT) { + return OkHttp3.usingOkHttp3(options, sslConfiguration); + } + if (OKHTTP_PRESENT) { return OkHttp.usingOkHttp(options, sslConfiguration); } @@ -102,7 +113,6 @@ public class ClientHttpRequestFactoryFactory { if (NETTY_PRESENT) { return Netty.usingNetty(options, sslConfiguration); } - } catch (GeneralSecurityException e) { throw new IllegalStateException(e); @@ -263,6 +273,31 @@ public class ClientHttpRequestFactoryFactory { } } + /** + * {@link ClientHttpRequestFactory} for the {@link OkHttpClient}. + * + * @author Mark Paluch + */ + static class OkHttp3 { + + static ClientHttpRequestFactory usingOkHttp3(ClientOptions options, + SslConfiguration sslConfiguration) throws GeneralSecurityException, + IOException { + + Builder builder = new Builder(); + + if (hasSslConfiguration(sslConfiguration)) { + builder.sslSocketFactory(getSSLContext(sslConfiguration) + .getSocketFactory()); + } + + builder.connectTimeout(options.getConnectionTimeout(), TimeUnit.MILLISECONDS) + .readTimeout(options.getReadTimeout(), TimeUnit.MILLISECONDS); + + return new OkHttp3ClientHttpRequestFactory(builder.build()); + } + } + /** * {@link ClientHttpRequestFactory} for Netty. * diff --git a/spring-vault-core/src/test/java/org/springframework/vault/config/ClientHttpRequestFactoryFactoryIntegrationTests.java b/spring-vault-core/src/test/java/org/springframework/vault/config/ClientHttpRequestFactoryFactoryIntegrationTests.java index 421935d8..4af775e9 100644 --- a/spring-vault-core/src/test/java/org/springframework/vault/config/ClientHttpRequestFactoryFactoryIntegrationTests.java +++ b/spring-vault-core/src/test/java/org/springframework/vault/config/ClientHttpRequestFactoryFactoryIntegrationTests.java @@ -25,11 +25,13 @@ import org.springframework.http.ResponseEntity; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.client.Netty4ClientHttpRequestFactory; +import org.springframework.http.client.OkHttp3ClientHttpRequestFactory; import org.springframework.http.client.OkHttpClientHttpRequestFactory; import org.springframework.vault.client.VaultEndpoint; import org.springframework.vault.config.ClientHttpRequestFactoryFactory.HttpComponents; import org.springframework.vault.config.ClientHttpRequestFactoryFactory.Netty; import org.springframework.vault.config.ClientHttpRequestFactoryFactory.OkHttp; +import org.springframework.vault.config.ClientHttpRequestFactoryFactory.OkHttp3; import org.springframework.vault.support.ClientOptions; import org.springframework.vault.util.Settings; import org.springframework.web.client.HttpStatusCodeException; @@ -93,6 +95,21 @@ public class ClientHttpRequestFactoryFactoryIntegrationTests { ((DisposableBean) factory).destroy(); } + @Test + public void okHttp3ClientShouldWork() throws Exception { + + ClientHttpRequestFactory factory = OkHttp3.usingOkHttp3(new ClientOptions(), + Settings.createSslConfiguration()); + RestTemplate template = new RestTemplate(factory); + + String response = request(template); + + assertThat(factory).isInstanceOf(OkHttp3ClientHttpRequestFactory.class); + assertThat(response).isNotNull().contains("initialized"); + + ((DisposableBean) factory).destroy(); + } + private String request(RestTemplate template) { // Uninitialized and sealed can cause status 500 diff --git a/spring-vault-dependencies/pom.xml b/spring-vault-dependencies/pom.xml index eebc0842..c55a702a 100644 --- a/spring-vault-dependencies/pom.xml +++ b/spring-vault-dependencies/pom.xml @@ -15,6 +15,7 @@ 4.4.5 4.1.6.Final 2.7.5 + 3.4.2 2.8.2 @@ -70,6 +71,13 @@ true + + com.squareup.okhttp3 + okhttp + ${okhttp3.version} + true + +