diff --git a/src/main/java/com/github/nkzawa/socketio/client/Manager.java b/src/main/java/com/github/nkzawa/socketio/client/Manager.java index dda72ac..218836d 100644 --- a/src/main/java/com/github/nkzawa/socketio/client/Manager.java +++ b/src/main/java/com/github/nkzawa/socketio/client/Manager.java @@ -66,6 +66,11 @@ public class Manager extends Emitter { public static final String EVENT_RECONNECTING = "reconnecting"; + /** + * Called when a new transport is created. (experimental) + */ + public static final String EVENT_TRANSPORT = Engine.EVENT_TRANSPORT; + /*package*/ static SSLContext defaultSSLContext; /*package*/ ReadyState readyState = null; @@ -221,6 +226,14 @@ public class Manager extends Emitter { Manager.this.readyState = ReadyState.OPENING; + // propagate transport event. + socket.on(Engine.EVENT_TRANSPORT, new Listener() { + @Override + public void call(Object... args) { + self.emit(Manager.EVENT_TRANSPORT, args); + } + }); + final On.Handle openSub = On.on(socket, Engine.EVENT_OPEN, new Listener() { @Override public void call(Object... objects) { diff --git a/src/test/java/com/github/nkzawa/socketio/client/ServerConnectionTest.java b/src/test/java/com/github/nkzawa/socketio/client/ServerConnectionTest.java index 2ad8dcc..ae85e72 100644 --- a/src/test/java/com/github/nkzawa/socketio/client/ServerConnectionTest.java +++ b/src/test/java/com/github/nkzawa/socketio/client/ServerConnectionTest.java @@ -1,12 +1,16 @@ package com.github.nkzawa.socketio.client; import com.github.nkzawa.emitter.Emitter; +import com.github.nkzawa.engineio.client.Transport; +import com.github.nkzawa.engineio.client.transports.Polling; +import com.github.nkzawa.engineio.client.transports.WebSocket; import org.json.JSONObject; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.net.URISyntaxException; +import java.util.Map; import java.util.concurrent.Semaphore; import static org.hamcrest.CoreMatchers.*; @@ -262,4 +266,72 @@ public class ServerConnectionTest extends Connection { socket.connect(); semaphore.acquire(); } + + @Test(timeout = TIMEOUT) + public void pollingHeaders() throws URISyntaxException, InterruptedException { + final Semaphore semaphore = new Semaphore(0); + + IO.Options opts = createOptions(); + opts.transports = new String[] {Polling.NAME}; + socket = client(opts); + socket.io().on(Manager.EVENT_TRANSPORT, new Emitter.Listener() { + @Override + public void call(Object... args) { + Transport transport = (Transport)args[0]; + transport.on(Transport.EVENT_REQUEST_HEADERS, new Emitter.Listener() { + @Override + public void call(Object... args) { + @SuppressWarnings("unchecked") + Map headers = (Map)args[0]; + headers.put("X-SocketIO", "hi"); + } + }).on(Transport.EVENT_RESPONSE_HEADERS, new Emitter.Listener() { + @Override + public void call(Object... args) { + @SuppressWarnings("unchecked") + Map headers = (Map)args[0]; + assertThat(headers.get("X-SocketIO"), is("hi")); + socket.close(); + semaphore.release(); + } + }); + } + }); + socket.open(); + semaphore.acquire(); + } + + @Test(timeout = TIMEOUT) + public void websocketHandshakeHeaders() throws URISyntaxException, InterruptedException { + final Semaphore semaphore = new Semaphore(0); + + IO.Options opts = createOptions(); + opts.transports = new String[] {WebSocket.NAME}; + socket = client(opts); + socket.io().on(Manager.EVENT_TRANSPORT, new Emitter.Listener() { + @Override + public void call(Object... args) { + Transport transport = (Transport)args[0]; + transport.on(Transport.EVENT_REQUEST_HEADERS, new Emitter.Listener() { + @Override + public void call(Object... args) { + @SuppressWarnings("unchecked") + Map headers = (Map)args[0]; + headers.put("X-SocketIO", "hi"); + } + }).on(Transport.EVENT_RESPONSE_HEADERS, new Emitter.Listener() { + @Override + public void call(Object... args) { + @SuppressWarnings("unchecked") + Map headers = (Map)args[0]; + assertThat(headers.get("X-SocketIO"), is("hi")); + socket.close(); + semaphore.release(); + } + }); + } + }); + socket.open(); + semaphore.acquire(); + } } diff --git a/src/test/resources/server.js b/src/test/resources/server.js index 4414c4a..06a7ce4 100644 --- a/src/test/resources/server.js +++ b/src/test/resources/server.js @@ -64,6 +64,32 @@ io.of(nsp).on('connection', function(socket) { }); }); + +function before(context, name, fn) { + var method = context[name]; + context[name] = function() { + fn.apply(this, arguments); + return method.apply(this, arguments); + }; +} + +before(io.eio, 'handleRequest', function(req, res) { + // echo a header value + var value = req.headers['x-socketio']; + if (!value) return; + res.setHeader('X-SocketIO', value); +}); + +before(io.eio, 'handleUpgrade', function(req, socket, head) { + // echo a header value for websocket handshake + var value = req.headers['x-socketio']; + if (!value) return; + this.ws.once('headers', function(headers) { + headers.push('X-SocketIO: ' + value); + }); +}); + + server.listen(port, function() { console.log('Socket.IO server listening on port', port); });