diff --git a/README.md b/README.md
index 922289e..a7c8718 100644
--- a/README.md
+++ b/README.md
@@ -125,14 +125,19 @@ socket.on("foo", new Emitter.Listener() {
SSL (HTTPS, WSS) settings:
```java
+OkHttpClient okHttpClient = new OkHttpClient.Builder()
+ .hostnameVerifier(myHostnameVerifier)
+ .sslSocketFactory(mySSLContext.getSocketFactory(), myX509TrustManager)
+ .build();
+
// default settings for all sockets
-IO.setDefaultSSLContext(mySSLContext);
-IO.setDefaultHostnameVerifier(myHostnameVerifier);
+Socket.setDefaultOkHttpWebSocketFactory(okHttpClient);
+Socket.setDefaultOkHttpCallFactory(okHttpClient);
// set as an option
opts = new IO.Options();
-opts.sslContext = mySSLContext;
-opts.hostnameVerifier = myHostnameVerifier;
+opts.callFactory = okHttpClient;
+opts.webSocketFactory = okHttpClient;
socket = IO.socket("https://localhost", opts);
```
diff --git a/pom.xml b/pom.xml
index 92e6d4e..091ef20 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,7 +62,7 @@
io.socket
engine.io-client
- 0.8.3
+ 0.8.4-SNAPSHOT
org.json
diff --git a/src/main/java/io/socket/client/IO.java b/src/main/java/io/socket/client/IO.java
index 06912a0..07aa46c 100644
--- a/src/main/java/io/socket/client/IO.java
+++ b/src/main/java/io/socket/client/IO.java
@@ -2,6 +2,9 @@ package io.socket.client;
import io.socket.parser.Parser;
+import okhttp3.Call;
+import okhttp3.OkHttpClient;
+import okhttp3.WebSocket;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
@@ -23,12 +26,12 @@ public class IO {
*/
public static int protocol = Parser.protocol;
- public static void setDefaultSSLContext(SSLContext sslContext) {
- Manager.defaultSSLContext = sslContext;
+ public static void setDefaultOkHttpWebSocketFactory(WebSocket.Factory factory) {
+ Manager.defaultWebSocketFactory = factory;
}
- public static void setDefaultHostnameVerifier(HostnameVerifier hostnameVerifier) {
- Manager.defaultHostnameVerifier = hostnameVerifier;
+ public static void setDefaultOkHttpCallFactory(Call.Factory factory) {
+ Manager.defaultCallFactory = factory;
}
private IO() {}
@@ -82,7 +85,12 @@ public class IO {
io = managers.get(id);
}
- return io.socket(parsed.getPath());
+ String query = parsed.getQuery();
+ if (query != null && (opts.query == null || opts.query.isEmpty())) {
+ opts.query = query;
+ }
+
+ return io.socket(parsed.getPath(), opts);
}
diff --git a/src/main/java/io/socket/client/Manager.java b/src/main/java/io/socket/client/Manager.java
index 69a8909..c20e0db 100644
--- a/src/main/java/io/socket/client/Manager.java
+++ b/src/main/java/io/socket/client/Manager.java
@@ -5,6 +5,8 @@ import io.socket.emitter.Emitter;
import io.socket.parser.Packet;
import io.socket.parser.Parser;
import io.socket.thread.EventThread;
+import okhttp3.Call;
+import okhttp3.WebSocket;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
@@ -73,8 +75,8 @@ public class Manager extends Emitter {
*/
public static final String EVENT_TRANSPORT = Engine.EVENT_TRANSPORT;
- /*package*/ static SSLContext defaultSSLContext;
- /*package*/ static HostnameVerifier defaultHostnameVerifier;
+ /*package*/ static WebSocket.Factory defaultWebSocketFactory;
+ /*package*/ static Call.Factory defaultCallFactory;
/*package*/ ReadyState readyState;
@@ -123,11 +125,11 @@ public class Manager extends Emitter {
if (opts.path == null) {
opts.path = "/socket.io";
}
- if (opts.sslContext == null) {
- opts.sslContext = defaultSSLContext;
+ if (opts.webSocketFactory == null) {
+ opts.webSocketFactory = defaultWebSocketFactory;
}
- if (opts.hostnameVerifier == null) {
- opts.hostnameVerifier = defaultHostnameVerifier;
+ if (opts.callFactory == null) {
+ opts.callFactory = defaultCallFactory;
}
this.opts = opts;
this.nsps = new ConcurrentHashMap();
@@ -416,12 +418,13 @@ public class Manager extends Emitter {
* Initializes {@link Socket} instances for each namespaces.
*
* @param nsp namespace.
+ * @param opts options.
* @return a socket instance for the namespace.
*/
- public Socket socket(String nsp) {
+ public Socket socket(String nsp, Options opts) {
Socket socket = this.nsps.get(nsp);
if (socket == null) {
- socket = new Socket(this, nsp);
+ socket = new Socket(this, nsp, opts);
Socket _socket = this.nsps.putIfAbsent(nsp, socket);
if (_socket != null) {
socket = _socket;
@@ -445,6 +448,10 @@ public class Manager extends Emitter {
return socket;
}
+ public Socket socket(String nsp) {
+ return socket(nsp, null);
+ }
+
/*package*/ void destroy(Socket socket) {
this.connecting.remove(socket);
if (!this.connecting.isEmpty()) return;
@@ -456,6 +463,10 @@ public class Manager extends Emitter {
logger.fine(String.format("writing packet %s", packet));
final Manager self = this;
+ if (packet.query != null && !packet.query.isEmpty() && packet.type == Parser.CONNECT) {
+ packet.nsp += "?" + packet.query;
+ }
+
if (!self.encoding) {
self.encoding = true;
this.encoder.encode(packet, new Parser.Encoder.Callback() {
diff --git a/src/main/java/io/socket/client/Socket.java b/src/main/java/io/socket/client/Socket.java
index cd998f4..c309030 100644
--- a/src/main/java/io/socket/client/Socket.java
+++ b/src/main/java/io/socket/client/Socket.java
@@ -79,6 +79,7 @@ public class Socket extends Emitter {
}};
/*package*/ String id;
+ /*package*/ String query;
private volatile boolean connected;
private int ids;
@@ -89,9 +90,12 @@ public class Socket extends Emitter {
private final Queue> receiveBuffer = new LinkedList>();
private final Queue> sendBuffer = new LinkedList>();
- public Socket(Manager io, String nsp) {
+ public Socket(Manager io, String nsp, Manager.Options opts) {
this.io = io;
this.nsp = nsp;
+ if (opts != null) {
+ this.query = opts.query;
+ }
}
private void subEvents() {
@@ -268,7 +272,13 @@ public class Socket extends Emitter {
logger.fine("transport is open - connecting");
if (!"/".equals(this.nsp)) {
- this.packet(new Packet(Parser.CONNECT));
+ if (this.query != null && !this.query.isEmpty()) {
+ Packet packet = new Packet(Parser.CONNECT);
+ packet.query = this.query;
+ this.packet(packet);
+ } else {
+ this.packet(new Packet(Parser.CONNECT));
+ }
}
}
diff --git a/src/main/java/io/socket/parser/Packet.java b/src/main/java/io/socket/parser/Packet.java
index ae5e35b..da65f68 100644
--- a/src/main/java/io/socket/parser/Packet.java
+++ b/src/main/java/io/socket/parser/Packet.java
@@ -8,6 +8,7 @@ public class Packet {
public String nsp;
public T data;
public int attachments;
+ public String query;
public Packet() {}
diff --git a/src/test/java/io/socket/client/ExecutionTest.java b/src/test/java/io/socket/client/ExecutionTest.java
index d6db39a..b4bf6a7 100644
--- a/src/test/java/io/socket/client/ExecutionTest.java
+++ b/src/test/java/io/socket/client/ExecutionTest.java
@@ -17,7 +17,7 @@ public class ExecutionTest extends Connection {
private static final Logger logger = Logger.getLogger(ExecutionTest.class.getName());
- final static int TIMEOUT = 60 * 1000;
+ final static int TIMEOUT = 100 * 1000;
@Test(timeout = TIMEOUT)
public void execConnection() throws InterruptedException, IOException {
diff --git a/src/test/java/io/socket/client/SSLConnectionTest.java b/src/test/java/io/socket/client/SSLConnectionTest.java
index db3daac..f0decc8 100644
--- a/src/test/java/io/socket/client/SSLConnectionTest.java
+++ b/src/test/java/io/socket/client/SSLConnectionTest.java
@@ -1,6 +1,7 @@
package io.socket.client;
import io.socket.emitter.Emitter;
+import okhttp3.OkHttpClient;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -9,7 +10,9 @@ import org.junit.runners.JUnit4;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509TrustManager;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -21,15 +24,20 @@ import java.util.concurrent.LinkedBlockingQueue;
@RunWith(JUnit4.class)
public class SSLConnectionTest extends Connection {
- // for test on localhost
- static HostnameVerifier hostnameVerifier = new javax.net.ssl.HostnameVerifier(){
- public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
- return hostname.equals("localhost");
- }
- };
+ private static OkHttpClient sOkHttpClient;
private Socket socket;
+ static {
+ try {
+ prepareOkHttpClient();
+ } catch(GeneralSecurityException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
@Override
String uri() {
return "https://localhost:" + PORT;
@@ -47,7 +55,7 @@ public class SSLConnectionTest extends Connection {
return new String[] {"DEBUG=socket.io:*", "PORT=" + PORT, "SSL=1"};
}
- SSLContext createSSLContext() throws GeneralSecurityException, IOException {
+ private static void prepareOkHttpClient() throws GeneralSecurityException, IOException {
KeyStore ks = KeyStore.getInstance("JKS");
File file = new File("src/test/resources/keystore.jks");
ks.load(new FileInputStream(file), "password".toCharArray());
@@ -60,21 +68,30 @@ public class SSLConnectionTest extends Connection {
SSLContext sslContext = SSLContext.getInstance("TLSv1");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
- return sslContext;
+
+ sOkHttpClient = new OkHttpClient.Builder()
+ .hostnameVerifier(new HostnameVerifier(){
+ public boolean verify(String hostname, SSLSession sslSession) {
+ return hostname.equals("localhost");
+ }
+ })
+ .sslSocketFactory(sslContext.getSocketFactory(),
+ (X509TrustManager) tmf.getTrustManagers()[0])
+ .build();
}
@After
public void tearDown() {
- IO.setDefaultSSLContext(null);
- IO.setDefaultHostnameVerifier(null);
+ IO.setDefaultOkHttpCallFactory(null);
+ IO.setDefaultOkHttpWebSocketFactory(null);
}
@Test(timeout = TIMEOUT)
public void connect() throws Exception {
final BlockingQueue