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
+
+