diff --git a/README.md b/README.md index 39ce2d6..bab32e2 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,15 @@ socket.on(Socket.EVENT_ERROR, new Emitter.Listener() { }); ``` +How to set options: + +```java +opts = new Socket.Options(); +opts.cookie = "foo=1;" + +socket = new Socket("ws://localhost", opts) { ... }; +``` + See the Javadoc for more details. http://nkzawa.github.io/engine.io-client.java/apidocs/ 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 79507d1..3a5440b 100644 --- a/src/main/java/com/github/nkzawa/engineio/client/Socket.java +++ b/src/main/java/com/github/nkzawa/engineio/client/Socket.java @@ -102,6 +102,7 @@ public abstract class Socket extends Emitter { private String hostname; private String path; private String timestampParam; + private String cookie; private List transports; private List upgrades; private Map query; @@ -165,6 +166,7 @@ public abstract class Socket extends Emitter { this.transports = new ArrayList(Arrays.asList(opts.transports != null ? opts.transports : new String[]{Polling.NAME, WebSocket.NAME})); this.policyPort = opts.policyPort != 0 ? opts.policyPort : 843; + this.cookie = opts.cookie; Socket.sockets.add(this); Socket.sockets.evs.emit(Sockets.EVENT_ADD, this); @@ -204,6 +206,7 @@ public abstract class Socket extends Emitter { opts.timestampRequests = this.timestampRequests; opts.timestampParam = this.timestampParam; opts.policyPort = this.policyPort; + opts.cookie = this.cookie; 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 5102c5a..5a61b53 100644 --- a/src/main/java/com/github/nkzawa/engineio/client/Transport.java +++ b/src/main/java/com/github/nkzawa/engineio/client/Transport.java @@ -121,6 +121,11 @@ public abstract class Transport extends Emitter { public static class Options { + /** + * Cookie value for handshake. + */ + public String cookie; + public String hostname; public String path; public String timestampParam; diff --git a/src/main/java/com/github/nkzawa/engineio/client/transports/PollingXHR.java b/src/main/java/com/github/nkzawa/engineio/client/transports/PollingXHR.java index d59adb4..779e8fc 100644 --- a/src/main/java/com/github/nkzawa/engineio/client/transports/PollingXHR.java +++ b/src/main/java/com/github/nkzawa/engineio/client/transports/PollingXHR.java @@ -17,9 +17,11 @@ public class PollingXHR extends Polling { private Request sendXhr; private Request pollXhr; + private String cookie; public PollingXHR(Options opts) { super(opts); + this.cookie = opts.cookie; } protected Request request() { @@ -31,6 +33,7 @@ public class PollingXHR extends Polling { opts = new Request.Options(); } opts.uri = this.uri(); + opts.cookie = this.cookie; return new Request(opts); } @@ -110,12 +113,14 @@ public class PollingXHR extends Polling { String method; String uri; String data; + String cookie; HttpURLConnection xhr; public Request(Options opts) { this.method = opts.method != null ? opts.method : "GET"; this.uri = opts.uri; this.data = opts.data; + this.cookie = opts.cookie; } public void create() { @@ -134,6 +139,10 @@ public class PollingXHR extends Polling { xhr.setRequestProperty("Content-type", "text/plain;charset=UTF-8"); } + if (this.cookie != null) { + xhr.setRequestProperty("Cookie", this.cookie); + } + logger.fine(String.format("sending xhr with url %s | data %s", this.uri, this.data)); xhrService.submit(new Runnable() { @Override @@ -201,6 +210,7 @@ public class PollingXHR extends Polling { public String uri; public String method; public String data; + public String cookie; } } } diff --git a/src/test/java/com/github/nkzawa/engineio/client/ServerConnectionTest.java b/src/test/java/com/github/nkzawa/engineio/client/ServerConnectionTest.java index 4d85815..0bd1654 100644 --- a/src/test/java/com/github/nkzawa/engineio/client/ServerConnectionTest.java +++ b/src/test/java/com/github/nkzawa/engineio/client/ServerConnectionTest.java @@ -217,4 +217,31 @@ public class ServerConnectionTest { socket.close(); } + + @Test(timeout = TIMEOUT) + public void cookie() throws URISyntaxException, InterruptedException { + final BlockingQueue messages = new LinkedBlockingQueue(); + + Socket.Options opts = new Socket.Options(); + opts.cookie = "foo=1;"; + + socket = new Socket("ws://localhost:" + PORT, opts) { + @Override + public void onopen() {} + + @Override + public void onmessage(String data) { + System.out.println("onmessage: " + data); + messages.offer(data); + } + + @Override + public void onclose() {} + }; + socket.open(); + + assertThat(messages.take(), is("hello client")); + assertThat(messages.take(), is(opts.cookie)); + socket.close(); + } } diff --git a/src/test/resources/index.js b/src/test/resources/index.js index 18d4ed4..86732b9 100644 --- a/src/test/resources/index.js +++ b/src/test/resources/index.js @@ -7,6 +7,11 @@ var engine = require('engine.io') server.on('connection', function(socket) { socket.send('hello client'); + if (socket.request.headers.cookie) { + console.log('cookie:', socket.request.headers.cookie); + socket.send(socket.request.headers.cookie); + } + socket.on('packet', function(packet) { console.log('packet:', packet); });