diff --git a/src/io/socket/IOConnection.java b/src/io/socket/IOConnection.java index 0febf78..c1abb3f 100644 --- a/src/io/socket/IOConnection.java +++ b/src/io/socket/IOConnection.java @@ -18,6 +18,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import java.util.Scanner; @@ -25,6 +26,7 @@ import java.util.TimerTask; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.logging.Logger; + import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; @@ -102,6 +104,9 @@ class IOConnection implements IOCallback { /** Custom Request headers used while handshaking */ private Properties headers; + /** Custom Request headers used while connecting to the websocket */ + private Map websocketHeaders; + /** * The first socket to be connected. the socket.io server does not send a * connected response to this one. @@ -331,7 +336,7 @@ private synchronized void connectTransport() { return; setState(STATE_CONNECTING); if (protocols.contains(WebsocketTransport.TRANSPORT_NAME)) - transport = WebsocketTransport.create(url, this); + transport = WebsocketTransport.create(url, this, websocketHeaders); else if (protocols.contains(XhrTransport.TRANSPORT_NAME)) transport = XhrTransport.create(url, this); else { @@ -412,6 +417,7 @@ private IOConnection(String url, SocketIO socket) { } firstSocket = socket; headers = socket.getHeaders(); + websocketHeaders = socket.getWebsocketHeaders(); sockets.put(socket.getNamespace(), socket); new ConnectThread().start(); } @@ -589,7 +595,7 @@ public void transportData(String text) { .listIterator(1); while (fragments.hasNext()) { int length = Integer.parseInt(fragments.next()); - String string = (String) fragments.next(); + String string = fragments.next(); // Potential BUG: it is not defined if length is in bytes or // characters. Assuming characters. diff --git a/src/io/socket/SocketIO.java b/src/io/socket/SocketIO.java index 26143b7..c1cd4bc 100644 --- a/src/io/socket/SocketIO.java +++ b/src/io/socket/SocketIO.java @@ -10,6 +10,8 @@ import java.net.MalformedURLException; import java.net.URL; +import java.util.HashMap; +import java.util.Map; import java.util.Properties; import javax.net.ssl.SSLContext; @@ -34,6 +36,9 @@ public class SocketIO { /** Used for setting header during handshaking. */ private Properties headers = new Properties(); + /** Used for setting header during connecting. */ + private Map websocketHeaders = new HashMap(); + private URL url; /** @@ -391,6 +396,20 @@ public SocketIO addHeader(String key, String value) { return this; } + /** + * Adds an header for connecting + * @return SocketIO.this for daisy chaining. + */ + public SocketIO addWebsocketHeader(String key, String value) { + if (this.connection != null) + throw new RuntimeException( + "You may only set headers before connecting.\n" + + " Try to use new SocketIO().addHeader(key, value).connect(host, callback) " + + "instead of SocketIO(host, callback).addHeader(key, value)"); + this.websocketHeaders.put(key, value); + return this; + } + /** * Returns the header value * @@ -401,4 +420,13 @@ public String getHeader(String key) { return this.headers.getProperty(key); return null; } + + /** + * Returns the headers used while connecting. + * + * @return the headers used while connecting + */ + public Map getWebsocketHeaders() { + return websocketHeaders; + } } diff --git a/src/io/socket/WebsocketTransport.java b/src/io/socket/WebsocketTransport.java index 0ec9bee..f55a27f 100644 --- a/src/io/socket/WebsocketTransport.java +++ b/src/io/socket/WebsocketTransport.java @@ -3,6 +3,7 @@ import java.io.IOException; import java.net.URI; import java.net.URL; +import java.util.Map; import java.util.regex.Pattern; import javax.net.ssl.SSLContext; @@ -10,23 +11,25 @@ import org.java_websocket.client.DefaultSSLWebSocketClientFactory; import org.java_websocket.client.WebSocketClient; +import org.java_websocket.drafts.Draft; +import org.java_websocket.drafts.Draft_17; import org.java_websocket.handshake.ServerHandshake; class WebsocketTransport extends WebSocketClient implements IOTransport { private final static Pattern PATTERN_HTTP = Pattern.compile("^http"); public static final String TRANSPORT_NAME = "websocket"; private IOConnection connection; - public static IOTransport create(URL url, IOConnection connection) { + public static IOTransport create(URL url, IOConnection connection, Map httpHeaders) { URI uri = URI.create( PATTERN_HTTP.matcher(url.toString()).replaceFirst("ws") + IOConnection.SOCKET_IO_1 + TRANSPORT_NAME + "/" + connection.getSessionId()); - return new WebsocketTransport(uri, connection); + return new WebsocketTransport(uri, connection, httpHeaders); } - public WebsocketTransport(URI uri, IOConnection connection) { - super(uri); + public WebsocketTransport(URI uri, IOConnection connection, Map httpHeaders) { + super(uri, new Draft_17(), httpHeaders, 0); this.connection = connection; SSLContext context = IOConnection.getSslContext(); if("wss".equals(uri.getScheme()) && context != null) {