Add support for OkHttp 3.

Fixes gh-39.
This commit is contained in:
Mark Paluch
2016-12-14 11:30:22 +01:00
parent d1a76b7ed4
commit 65494e4e63
4 changed files with 67 additions and 1 deletions

View File

@@ -57,6 +57,12 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>

View File

@@ -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.
*

View File

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

View File

@@ -15,6 +15,7 @@
<httpcore.version>4.4.5</httpcore.version>
<netty.version>4.1.6.Final</netty.version>
<okhttp.version>2.7.5</okhttp.version>
<okhttp3.version>3.4.2</okhttp3.version>
<jackson.version>2.8.2</jackson.version>
</properties>
@@ -70,6 +71,13 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>${okhttp3.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>