From 464b7302d42a5541975d50053c249fa450b840a3 Mon Sep 17 00:00:00 2001 From: Yu-Hsuan Lin Date: Tue, 14 Apr 2015 11:57:56 +0800 Subject: [PATCH] add new Options for feeding custom OkHttpClient --- pom.xml | 5 ++ .../github/nkzawa/engineio/client/Socket.java | 5 ++ .../nkzawa/engineio/client/Transport.java | 4 ++ .../engineio/client/transports/WebSocket.java | 2 +- .../engineio/client/SSLConnectionTest.java | 56 +++++++------------ 5 files changed, 34 insertions(+), 38 deletions(-) diff --git a/pom.xml b/pom.xml index 735d9b5..25e03e9 100644 --- a/pom.xml +++ b/pom.xml @@ -64,6 +64,11 @@ okhttp-ws 2.3.0 + + com.squareup.okhttp + mockwebserver + 2.3.0 + diff --git a/src/main/java/com/github/nkzawa/engineio/client/Socket.java b/src/main/java/com/github/nkzawa/engineio/client/Socket.java index ac37fef..97d40eb 100644 --- a/src/main/java/com/github/nkzawa/engineio/client/Socket.java +++ b/src/main/java/com/github/nkzawa/engineio/client/Socket.java @@ -8,6 +8,8 @@ import com.github.nkzawa.engineio.parser.Packet; import com.github.nkzawa.engineio.parser.Parser; import com.github.nkzawa.parseqs.ParseQS; import com.github.nkzawa.thread.EventThread; +import com.squareup.okhttp.OkHttpClient; + import org.json.JSONException; import javax.net.ssl.SSLContext; @@ -121,6 +123,7 @@ public class Socket extends Emitter { private Future pingTimeoutTimer; private Future pingIntervalTimer; private SSLContext sslContext; + private OkHttpClient okHttpClient; private ReadyState readyState; private ScheduledExecutorService heartbeatScheduler; @@ -197,6 +200,7 @@ public class Socket extends Emitter { opts.transports : new String[]{Polling.NAME, WebSocket.NAME})); this.policyPort = opts.policyPort != 0 ? opts.policyPort : 843; this.rememberUpgrade = opts.rememberUpgrade; + this.okHttpClient = opts.okHttpClient; } /** @@ -254,6 +258,7 @@ public class Socket extends Emitter { opts.timestampParam = this.timestampParam; opts.policyPort = this.policyPort; opts.socket = this; + opts.okHttpClient = this.okHttpClient; if (WebSocket.NAME.equals(name)) { return new WebSocket(opts); diff --git a/src/main/java/com/github/nkzawa/engineio/client/Transport.java b/src/main/java/com/github/nkzawa/engineio/client/Transport.java index 8277075..d0c6f9c 100644 --- a/src/main/java/com/github/nkzawa/engineio/client/Transport.java +++ b/src/main/java/com/github/nkzawa/engineio/client/Transport.java @@ -5,6 +5,7 @@ import com.github.nkzawa.emitter.Emitter; import com.github.nkzawa.engineio.parser.Packet; import com.github.nkzawa.engineio.parser.Parser; import com.github.nkzawa.thread.EventThread; +import com.squareup.okhttp.OkHttpClient; import javax.net.ssl.SSLContext; import java.util.Map; @@ -42,6 +43,7 @@ public abstract class Transport extends Emitter { protected String timestampParam; protected SSLContext sslContext; protected Socket socket; + protected OkHttpClient okHttpClient; protected ReadyState readyState; @@ -55,6 +57,7 @@ public abstract class Transport extends Emitter { this.timestampRequests = opts.timestampRequests; this.sslContext = opts.sslContext; this.socket = opts.socket; + this.okHttpClient = opts.okHttpClient; } protected Transport onError(String msg, Exception desc) { @@ -144,6 +147,7 @@ public abstract class Transport extends Emitter { public int policyPort = -1; public Map query; public SSLContext sslContext; + public OkHttpClient okHttpClient; protected Socket socket; } } diff --git a/src/main/java/com/github/nkzawa/engineio/client/transports/WebSocket.java b/src/main/java/com/github/nkzawa/engineio/client/transports/WebSocket.java index e33f975..6331e13 100644 --- a/src/main/java/com/github/nkzawa/engineio/client/transports/WebSocket.java +++ b/src/main/java/com/github/nkzawa/engineio/client/transports/WebSocket.java @@ -48,7 +48,7 @@ public class WebSocket extends Transport { this.emit(EVENT_REQUEST_HEADERS, headers); final WebSocket self = this; - final OkHttpClient client = new OkHttpClient(); + final OkHttpClient client = this.okHttpClient != null ? this.okHttpClient : new OkHttpClient(); if (this.sslContext != null) { SSLSocketFactory factory = sslContext.getSocketFactory();// (SSLSocketFactory) SSLSocketFactory.getDefault(); client.setSslSocketFactory(factory); diff --git a/src/test/java/com/github/nkzawa/engineio/client/SSLConnectionTest.java b/src/test/java/com/github/nkzawa/engineio/client/SSLConnectionTest.java index c4c0e5c..c50b3c8 100644 --- a/src/test/java/com/github/nkzawa/engineio/client/SSLConnectionTest.java +++ b/src/test/java/com/github/nkzawa/engineio/client/SSLConnectionTest.java @@ -1,37 +1,31 @@ package com.github.nkzawa.engineio.client; import com.github.nkzawa.emitter.Emitter; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.internal.SslContextBuilder; + import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManagerFactory; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.security.KeyStore; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; +import javax.net.ssl.HostnameVerifier; + import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @RunWith(JUnit4.class) public class SSLConnectionTest extends Connection { - static { - // for test on localhost - javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier( - new javax.net.ssl.HostnameVerifier(){ - public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) { - return hostname.equals("localhost"); - } - }); - } + static HostnameVerifier hostnameVerifier = new javax.net.ssl.HostnameVerifier(){ + public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) { + return true; + } + }; + private Socket socket; @@ -52,28 +46,13 @@ public class SSLConnectionTest extends Connection { return new String[] {"DEBUG=engine*", "PORT=" + PORT, "SSL=1"}; } - SSLContext createSSLContext() throws GeneralSecurityException, IOException { - KeyStore ks = KeyStore.getInstance("JKS"); - File file = new File("src/test/resources/keystore.jks"); - ks.load(new FileInputStream(file), "password".toCharArray()); - - KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); - kmf.init(ks, "password".toCharArray()); - - TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); - tmf.init(ks); - - SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); - return sslContext; - } - @Test(timeout = TIMEOUT) public void connect() throws Exception { final BlockingQueue values = new LinkedBlockingQueue(); Socket.Options opts = createOptions(); - opts.sslContext = createSSLContext(); + opts.sslContext = SslContextBuilder.localhost(); + opts.okHttpClient = new OkHttpClient().setHostnameVerifier(hostnameVerifier); socket = new Socket(opts); socket.on(Socket.EVENT_OPEN, new Emitter.Listener() { @Override @@ -97,7 +76,8 @@ public class SSLConnectionTest extends Connection { final BlockingQueue values = new LinkedBlockingQueue(); Socket.Options opts = createOptions(); - opts.sslContext = createSSLContext(); + opts.sslContext = SslContextBuilder.localhost(); + opts.okHttpClient = new OkHttpClient().setHostnameVerifier(hostnameVerifier); socket = new Socket(opts); socket.on(Socket.EVENT_OPEN, new Emitter.Listener() { @Override @@ -126,8 +106,10 @@ public class SSLConnectionTest extends Connection { public void defaultSSLContext() throws Exception { final BlockingQueue values = new LinkedBlockingQueue(); - Socket.setDefaultSSLContext(createSSLContext()); - socket = new Socket(createOptions()); + Socket.Options opts = createOptions(); + Socket.setDefaultSSLContext(SslContextBuilder.localhost()); + opts.okHttpClient = new OkHttpClient().setHostnameVerifier(hostnameVerifier); + socket = new Socket(opts); socket.on(Socket.EVENT_OPEN, new Emitter.Listener() { @Override public void call(Object... args) {