fix #28 enable to access http headers

This commit is contained in:
Naoyuki Kanezawa
2014-08-17 06:03:58 +09:00
parent 65813b5859
commit 026f363707
3 changed files with 111 additions and 0 deletions

View File

@@ -66,6 +66,11 @@ public class Manager extends Emitter {
public static final String EVENT_RECONNECTING = "reconnecting"; 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*/ static SSLContext defaultSSLContext;
/*package*/ ReadyState readyState = null; /*package*/ ReadyState readyState = null;
@@ -221,6 +226,14 @@ public class Manager extends Emitter {
Manager.this.readyState = ReadyState.OPENING; 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() { final On.Handle openSub = On.on(socket, Engine.EVENT_OPEN, new Listener() {
@Override @Override
public void call(Object... objects) { public void call(Object... objects) {

View File

@@ -1,12 +1,16 @@
package com.github.nkzawa.socketio.client; package com.github.nkzawa.socketio.client;
import com.github.nkzawa.emitter.Emitter; 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.json.JSONObject;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runners.JUnit4; import org.junit.runners.JUnit4;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.Map;
import java.util.concurrent.Semaphore; import java.util.concurrent.Semaphore;
import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.CoreMatchers.*;
@@ -262,4 +266,72 @@ public class ServerConnectionTest extends Connection {
socket.connect(); socket.connect();
semaphore.acquire(); 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<String, String> headers = (Map<String, String>)args[0];
headers.put("X-SocketIO", "hi");
}
}).on(Transport.EVENT_RESPONSE_HEADERS, new Emitter.Listener() {
@Override
public void call(Object... args) {
@SuppressWarnings("unchecked")
Map<String, String> headers = (Map<String, String>)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<String, String> headers = (Map<String, String>)args[0];
headers.put("X-SocketIO", "hi");
}
}).on(Transport.EVENT_RESPONSE_HEADERS, new Emitter.Listener() {
@Override
public void call(Object... args) {
@SuppressWarnings("unchecked")
Map<String, String> headers = (Map<String, String>)args[0];
assertThat(headers.get("X-SocketIO"), is("hi"));
socket.close();
semaphore.release();
}
});
}
});
socket.open();
semaphore.acquire();
}
} }

View File

@@ -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() { server.listen(port, function() {
console.log('Socket.IO server listening on port', port); console.log('Socket.IO server listening on port', port);
}); });