Skip to content
This repository was archived by the owner on Mar 6, 2018. It is now read-only.

public api that allows adding headers to the websocket connect http request #74

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions src/io/socket/IOConnection.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@
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;
import java.util.Timer;
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;
Expand Down Expand Up @@ -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<String, String> websocketHeaders;

/**
* The first socket to be connected. the socket.io server does not send a
* connected response to this one.
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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.

Expand Down
28 changes: 28 additions & 0 deletions src/io/socket/SocketIO.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<String, String> websocketHeaders = new HashMap<String, String>();

private URL url;

/**
Expand Down Expand Up @@ -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
*
Expand All @@ -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<String, String> getWebsocketHeaders() {
return websocketHeaders;
}
}
11 changes: 7 additions & 4 deletions src/io/socket/WebsocketTransport.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,33 @@
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;
import javax.net.ssl.SSLSocketFactory;

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<String,String> 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<String,String> httpHeaders) {
super(uri, new Draft_17(), httpHeaders, 0);
this.connection = connection;
SSLContext context = IOConnection.getSslContext();
if("wss".equals(uri.getScheme()) && context != null) {
Expand Down