Skip to content

Commit f3e3c74

Browse files
authored
Merge pull request #436 from socketio/fix/socket.io-client-1.7.4
make compatible with socket.io-client 1.7.4 (node client)
2 parents 8f8c138 + 4811368 commit f3e3c74

File tree

11 files changed

+435
-36
lines changed

11 files changed

+435
-36
lines changed

README.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,14 +125,19 @@ socket.on("foo", new Emitter.Listener() {
125125
SSL (HTTPS, WSS) settings:
126126

127127
```java
128+
OkHttpClient okHttpClient = new OkHttpClient.Builder()
129+
.hostnameVerifier(myHostnameVerifier)
130+
.sslSocketFactory(mySSLContext.getSocketFactory(), myX509TrustManager)
131+
.build();
132+
128133
// default settings for all sockets
129-
IO.setDefaultSSLContext(mySSLContext);
130-
IO.setDefaultHostnameVerifier(myHostnameVerifier);
134+
Socket.setDefaultOkHttpWebSocketFactory(okHttpClient);
135+
Socket.setDefaultOkHttpCallFactory(okHttpClient);
131136

132137
// set as an option
133138
opts = new IO.Options();
134-
opts.sslContext = mySSLContext;
135-
opts.hostnameVerifier = myHostnameVerifier;
139+
opts.callFactory = okHttpClient;
140+
opts.webSocketFactory = okHttpClient;
136141
socket = IO.socket("https://localhost", opts);
137142
```
138143

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
<dependency>
6363
<groupId>io.socket</groupId>
6464
<artifactId>engine.io-client</artifactId>
65-
<version>0.8.3</version>
65+
<version>0.8.4-SNAPSHOT</version>
6666
</dependency>
6767
<dependency>
6868
<groupId>org.json</groupId>

src/main/java/io/socket/client/IO.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33

44
import io.socket.parser.Parser;
5+
import okhttp3.Call;
6+
import okhttp3.OkHttpClient;
7+
import okhttp3.WebSocket;
58

69
import javax.net.ssl.HostnameVerifier;
710
import javax.net.ssl.SSLContext;
@@ -23,12 +26,12 @@ public class IO {
2326
*/
2427
public static int protocol = Parser.protocol;
2528

26-
public static void setDefaultSSLContext(SSLContext sslContext) {
27-
Manager.defaultSSLContext = sslContext;
29+
public static void setDefaultOkHttpWebSocketFactory(WebSocket.Factory factory) {
30+
Manager.defaultWebSocketFactory = factory;
2831
}
2932

30-
public static void setDefaultHostnameVerifier(HostnameVerifier hostnameVerifier) {
31-
Manager.defaultHostnameVerifier = hostnameVerifier;
33+
public static void setDefaultOkHttpCallFactory(Call.Factory factory) {
34+
Manager.defaultCallFactory = factory;
3235
}
3336

3437
private IO() {}
@@ -82,7 +85,12 @@ public static Socket socket(URI uri, Options opts) {
8285
io = managers.get(id);
8386
}
8487

85-
return io.socket(parsed.getPath());
88+
String query = parsed.getQuery();
89+
if (query != null && (opts.query == null || opts.query.isEmpty())) {
90+
opts.query = query;
91+
}
92+
93+
return io.socket(parsed.getPath(), opts);
8694
}
8795

8896

src/main/java/io/socket/client/Manager.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import io.socket.parser.Packet;
66
import io.socket.parser.Parser;
77
import io.socket.thread.EventThread;
8+
import okhttp3.Call;
9+
import okhttp3.WebSocket;
810

911
import javax.net.ssl.HostnameVerifier;
1012
import javax.net.ssl.SSLContext;
@@ -73,8 +75,8 @@ public class Manager extends Emitter {
7375
*/
7476
public static final String EVENT_TRANSPORT = Engine.EVENT_TRANSPORT;
7577

76-
/*package*/ static SSLContext defaultSSLContext;
77-
/*package*/ static HostnameVerifier defaultHostnameVerifier;
78+
/*package*/ static WebSocket.Factory defaultWebSocketFactory;
79+
/*package*/ static Call.Factory defaultCallFactory;
7880

7981
/*package*/ ReadyState readyState;
8082

@@ -123,11 +125,11 @@ public Manager(URI uri, Options opts) {
123125
if (opts.path == null) {
124126
opts.path = "/socket.io";
125127
}
126-
if (opts.sslContext == null) {
127-
opts.sslContext = defaultSSLContext;
128+
if (opts.webSocketFactory == null) {
129+
opts.webSocketFactory = defaultWebSocketFactory;
128130
}
129-
if (opts.hostnameVerifier == null) {
130-
opts.hostnameVerifier = defaultHostnameVerifier;
131+
if (opts.callFactory == null) {
132+
opts.callFactory = defaultCallFactory;
131133
}
132134
this.opts = opts;
133135
this.nsps = new ConcurrentHashMap<String, Socket>();
@@ -416,12 +418,13 @@ private void onerror(Exception err) {
416418
* Initializes {@link Socket} instances for each namespaces.
417419
*
418420
* @param nsp namespace.
421+
* @param opts options.
419422
* @return a socket instance for the namespace.
420423
*/
421-
public Socket socket(String nsp) {
424+
public Socket socket(String nsp, Options opts) {
422425
Socket socket = this.nsps.get(nsp);
423426
if (socket == null) {
424-
socket = new Socket(this, nsp);
427+
socket = new Socket(this, nsp, opts);
425428
Socket _socket = this.nsps.putIfAbsent(nsp, socket);
426429
if (_socket != null) {
427430
socket = _socket;
@@ -445,6 +448,10 @@ public void call(Object... objects) {
445448
return socket;
446449
}
447450

451+
public Socket socket(String nsp) {
452+
return socket(nsp, null);
453+
}
454+
448455
/*package*/ void destroy(Socket socket) {
449456
this.connecting.remove(socket);
450457
if (!this.connecting.isEmpty()) return;
@@ -456,6 +463,10 @@ public void call(Object... objects) {
456463
logger.fine(String.format("writing packet %s", packet));
457464
final Manager self = this;
458465

466+
if (packet.query != null && !packet.query.isEmpty() && packet.type == Parser.CONNECT) {
467+
packet.nsp += "?" + packet.query;
468+
}
469+
459470
if (!self.encoding) {
460471
self.encoding = true;
461472
this.encoder.encode(packet, new Parser.Encoder.Callback() {

src/main/java/io/socket/client/Socket.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ public class Socket extends Emitter {
7979
}};
8080

8181
/*package*/ String id;
82+
/*package*/ String query;
8283

8384
private volatile boolean connected;
8485
private int ids;
@@ -89,9 +90,12 @@ public class Socket extends Emitter {
8990
private final Queue<List<Object>> receiveBuffer = new LinkedList<List<Object>>();
9091
private final Queue<Packet<JSONArray>> sendBuffer = new LinkedList<Packet<JSONArray>>();
9192

92-
public Socket(Manager io, String nsp) {
93+
public Socket(Manager io, String nsp, Manager.Options opts) {
9394
this.io = io;
9495
this.nsp = nsp;
96+
if (opts != null) {
97+
this.query = opts.query;
98+
}
9599
}
96100

97101
private void subEvents() {
@@ -268,7 +272,13 @@ private void onopen() {
268272
logger.fine("transport is open - connecting");
269273

270274
if (!"/".equals(this.nsp)) {
271-
this.packet(new Packet(Parser.CONNECT));
275+
if (this.query != null && !this.query.isEmpty()) {
276+
Packet packet = new Packet(Parser.CONNECT);
277+
packet.query = this.query;
278+
this.packet(packet);
279+
} else {
280+
this.packet(new Packet(Parser.CONNECT));
281+
}
272282
}
273283
}
274284

src/main/java/io/socket/parser/Packet.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public class Packet<T> {
88
public String nsp;
99
public T data;
1010
public int attachments;
11+
public String query;
1112

1213
public Packet() {}
1314

src/test/java/io/socket/client/ExecutionTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class ExecutionTest extends Connection {
1717

1818
private static final Logger logger = Logger.getLogger(ExecutionTest.class.getName());
1919

20-
final static int TIMEOUT = 60 * 1000;
20+
final static int TIMEOUT = 100 * 1000;
2121

2222
@Test(timeout = TIMEOUT)
2323
public void execConnection() throws InterruptedException, IOException {

src/test/java/io/socket/client/SSLConnectionTest.java

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.socket.client;
22

33
import io.socket.emitter.Emitter;
4+
import okhttp3.OkHttpClient;
45
import org.junit.After;
56
import org.junit.Test;
67
import org.junit.runner.RunWith;
@@ -9,7 +10,9 @@
910
import javax.net.ssl.HostnameVerifier;
1011
import javax.net.ssl.KeyManagerFactory;
1112
import javax.net.ssl.SSLContext;
13+
import javax.net.ssl.SSLSession;
1214
import javax.net.ssl.TrustManagerFactory;
15+
import javax.net.ssl.X509TrustManager;
1316
import java.io.File;
1417
import java.io.FileInputStream;
1518
import java.io.IOException;
@@ -21,15 +24,20 @@
2124
@RunWith(JUnit4.class)
2225
public class SSLConnectionTest extends Connection {
2326

24-
// for test on localhost
25-
static HostnameVerifier hostnameVerifier = new javax.net.ssl.HostnameVerifier(){
26-
public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
27-
return hostname.equals("localhost");
28-
}
29-
};
27+
private static OkHttpClient sOkHttpClient;
3028

3129
private Socket socket;
3230

31+
static {
32+
try {
33+
prepareOkHttpClient();
34+
} catch(GeneralSecurityException e) {
35+
e.printStackTrace();
36+
} catch (IOException e) {
37+
e.printStackTrace();
38+
}
39+
}
40+
3341
@Override
3442
String uri() {
3543
return "https://localhost:" + PORT;
@@ -47,7 +55,7 @@ String[] createEnv() {
4755
return new String[] {"DEBUG=socket.io:*", "PORT=" + PORT, "SSL=1"};
4856
}
4957

50-
SSLContext createSSLContext() throws GeneralSecurityException, IOException {
58+
private static void prepareOkHttpClient() throws GeneralSecurityException, IOException {
5159
KeyStore ks = KeyStore.getInstance("JKS");
5260
File file = new File("src/test/resources/keystore.jks");
5361
ks.load(new FileInputStream(file), "password".toCharArray());
@@ -60,21 +68,30 @@ SSLContext createSSLContext() throws GeneralSecurityException, IOException {
6068

6169
SSLContext sslContext = SSLContext.getInstance("TLSv1");
6270
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
63-
return sslContext;
71+
72+
sOkHttpClient = new OkHttpClient.Builder()
73+
.hostnameVerifier(new HostnameVerifier(){
74+
public boolean verify(String hostname, SSLSession sslSession) {
75+
return hostname.equals("localhost");
76+
}
77+
})
78+
.sslSocketFactory(sslContext.getSocketFactory(),
79+
(X509TrustManager) tmf.getTrustManagers()[0])
80+
.build();
6481
}
6582

6683
@After
6784
public void tearDown() {
68-
IO.setDefaultSSLContext(null);
69-
IO.setDefaultHostnameVerifier(null);
85+
IO.setDefaultOkHttpCallFactory(null);
86+
IO.setDefaultOkHttpWebSocketFactory(null);
7087
}
7188

7289
@Test(timeout = TIMEOUT)
7390
public void connect() throws Exception {
7491
final BlockingQueue<Object> values = new LinkedBlockingQueue<Object>();
7592
IO.Options opts = createOptions();
76-
opts.sslContext = createSSLContext();
77-
opts.hostnameVerifier = hostnameVerifier;
93+
opts.callFactory = sOkHttpClient;
94+
opts.webSocketFactory = sOkHttpClient;
7895
socket = client(opts);
7996
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
8097
@Override
@@ -96,8 +113,8 @@ public void call(Object... args) {
96113
@Test(timeout = TIMEOUT)
97114
public void defaultSSLContext() throws Exception {
98115
final BlockingQueue<Object> values = new LinkedBlockingQueue<Object>();
99-
IO.setDefaultSSLContext(createSSLContext());
100-
IO.setDefaultHostnameVerifier(hostnameVerifier);
116+
IO.setDefaultOkHttpWebSocketFactory(sOkHttpClient);
117+
IO.setDefaultOkHttpCallFactory(sOkHttpClient);
101118
socket = client();
102119
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
103120
@Override

src/test/java/io/socket/client/SocketTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,21 @@ public void call(Object... objects) {
168168

169169
socket.disconnect();
170170
}
171+
172+
@Test(timeout = TIMEOUT)
173+
public void shouldStoreQueryStringAsAProperty() throws URISyntaxException, InterruptedException {
174+
IO.Options opts = new IO.Options();
175+
opts.query = "a=b";
176+
Socket socket = IO.socket(this.uri() + "/abc", opts);
177+
178+
Socket socket2 = IO.socket(this.uri() + "/abc?b=c&d=e");
179+
180+
IO.Options opts3 = new IO.Options();
181+
opts.query = "%26a=%26%3D%3Fa";
182+
Socket socket3 = IO.socket(this.uri() + "/abc", opts);
183+
184+
assertThat(socket.query, is("a=b"));
185+
assertThat(socket2.query, is("b=c&d=e"));
186+
assertThat(socket3.query, is("%26a=%26%3D%3Fa"));
187+
}
171188
}

0 commit comments

Comments
 (0)