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 f014790..17a0a63 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 @@ -14,6 +14,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.Date; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; public class WebSocket extends Transport { @@ -33,14 +34,25 @@ public class WebSocket extends Transport { return; } + Map headers = new HashMap(); + this.emit(EVENT_REQUEST_HEADERS, headers); + final WebSocket self = this; try { - this.socket = new WebSocketClient(new URI(this.uri()), new Draft_17()) { + this.socket = new WebSocketClient(new URI(this.uri()), new Draft_17(), headers, 0) { @Override - public void onOpen(ServerHandshake serverHandshake) { + public void onOpen(final ServerHandshake serverHandshake) { EventThread.exec(new Runnable() { @Override public void run() { + Map headers = new HashMap(); + Iterator it = serverHandshake.iterateHttpFields(); + while (it.hasNext()) { + String field = it.next(); + headers.put(field, serverHandshake.getFieldValue(field)); + } + self.emit(EVENT_RESPONSE_HEADERS, headers); + self.onOpen(); } }); 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 6d93597..edb4533 100644 --- a/src/test/java/com/github/nkzawa/engineio/client/ServerConnectionTest.java +++ b/src/test/java/com/github/nkzawa/engineio/client/ServerConnectionTest.java @@ -2,7 +2,7 @@ package com.github.nkzawa.engineio.client; import com.github.nkzawa.emitter.Emitter; import com.github.nkzawa.engineio.client.transports.Polling; -import com.github.nkzawa.engineio.client.transports.PollingXHR; +import com.github.nkzawa.engineio.client.transports.WebSocket; import com.github.nkzawa.engineio.parser.HandshakeData; import org.junit.After; import org.junit.Before; @@ -244,8 +244,6 @@ public class ServerConnectionTest { @Override public void call(Object... args) { Transport transport = (Transport)args[0]; - if (!(transport instanceof PollingXHR)) return; - transport.on(Transport.EVENT_REQUEST_HEADERS, new Emitter.Listener() { @Override public void call(Object... args) { @@ -269,4 +267,48 @@ public class ServerConnectionTest { assertThat(messages.take(), is("foo")); socket.close(); } + + @Test(timeout = TIMEOUT) + public void websocketHandshakeHeaders() throws URISyntaxException, InterruptedException { + final BlockingQueue messages = new LinkedBlockingQueue(); + + Socket.Options opts = new Socket.Options(); + opts.transports = new String[] {WebSocket.NAME}; + + socket = new Socket("ws://localhost:" + PORT, opts) { + @Override + public void onopen() {} + @Override + public void onmessage(String data) {} + @Override + public void onclose() {} + @Override + public void onerror(Exception err) {} + }; + socket.on(Socket.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-EngineIO", "foo"); + } + }).on(Transport.EVENT_RESPONSE_HEADERS, new Emitter.Listener() { + @Override + public void call(Object... args) { + @SuppressWarnings("unchecked") + Map headers = (Map)args[0]; + messages.offer(headers.get("X-EngineIO")); + } + }); + } + }); + socket.open(); + + assertThat(messages.take(), is("foo")); + socket.close(); + } } diff --git a/src/test/resources/index.js b/src/test/resources/index.js index b179185..47711db 100644 --- a/src/test/resources/index.js +++ b/src/test/resources/index.js @@ -19,10 +19,26 @@ server.on('connection', function(socket) { var handleRequest = server.handleRequest; server.handleRequest = function(req, res) { - var header = req.headers['x-engineio']; - if (header) { - res.setHeader('X-EngineIO', header); + // echo a header value + var value = req.headers['x-engineio']; + if (value) { + res.setHeader('X-EngineIO', value); } handleRequest.call(this, req, res); }; + +var headerValue; +var handleUpgrade = server.handleUpgrade; +server.handleUpgrade = function(req, socket, head) { + // echo a header value for websocket handshake + headerValue = req.headers['x-engineio']; + handleUpgrade.call(this, req, socket, head); +}; + +// FIXME: support parallel requests +server.ws.on('headers', function(headers) { + if (headerValue) { + headers.push('X-EngineIO: ' + headerValue); + } +});