Skip to content

Commit

Permalink
[fix] use routing table mhen proxying WebSockets.
Browse files Browse the repository at this point in the history
closes issue #72
  • Loading branch information
dominictarr committed Jul 21, 2011
1 parent baf0b9e commit efa17ef
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 0 deletions.
14 changes: 14 additions & 0 deletions lib/node-http-proxy.js
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,20 @@ HttpProxy.prototype.proxyWebSocketRequest = function (req, socket, head, options
CRLF = '\r\n',
outgoing;

options = options || {};
options.host = options.host || this.target.host;
options.port = options.port || this.target.port; //

if (this.proxyTable && !options.host) {
location = this.proxyTable.getProxyLocation(req);

if (!location) {
res.writeHead(404);

This comment has been minimized.

Copy link
@DanBUK

DanBUK Jul 22, 2011

Contributor

res is not defined for a upgrade connection. You need to socket.end(); & socket.destroy(); instead.

return res.end();
}
options.port = location.port;
options.host = location.host;
}
//
// WebSocket requests must have the `GET` method and
// the `upgrade:websocket` header
Expand Down
40 changes: 40 additions & 0 deletions test/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,10 @@ TestRunner.prototype.assertResponseCode = function (proxyPort, statusCode, creat
return test;
};

//
// WebSocketTest
//

TestRunner.prototype.webSocketTest = function (options) {
var self = this;

Expand Down Expand Up @@ -154,6 +158,42 @@ TestRunner.prototype.webSocketTest = function (options) {
});
}

//
// WebSocketTestWithTable
//

TestRunner.prototype.webSocketTestWithTable = function (options) {
var self = this;

this.startTargetServer(options.ports.target, 'hello websocket', function (err, target) {
var socket = options.io.listen(target);

if (options.onListen) {
options.onListen(socket);
}

self.startProxyServerWithTable(
options.ports.proxy,
{router: options.router},
function (err, proxy) {
if (options.onServer) { options.onServer(proxy) }

//
// Setup the web socket against our proxy
//
var uri = options.wsprotocol + '://' + options.host + ':' + options.ports.proxy;
var ws = new websocket.WebSocket(uri + '/socket.io/websocket/', 'borf', {
origin: options.protocol + '://' + options.host
});

if (options.onWsupgrade) { ws.on('wsupgrade', options.onWsupgrade) }
if (options.onMessage) { ws.on('message', options.onMessage) }
if (options.onOpen) { ws.on('open', function () { options.onOpen(ws) }) }
}
);
});
}

//
// Creates the reverse proxy server
//
Expand Down
45 changes: 45 additions & 0 deletions test/web-socket-proxy-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,50 @@ var protocol = argv.https ? 'https' : 'http',
runner = new helpers.TestRunner(protocol);

vows.describe('node-http-proxy/websocket/' + wsprotocol).addBatch({
"when using proxy table":{
"with no latency" : {
"when an inbound message is sent from a WebSocket client": {
topic: function () {
var that = this
headers = {};

runner.webSocketTestWithTable({
io: io,
host: 'localhost',
wsprotocol: wsprotocol,
protocol: protocol,
router: {'localhost':'localhost:8230'},
ports: {
target: 8230,
proxy: 8231
},
onListen: function (socket) {
socket.on('connection', function (client) {
client.on('message', function (msg) {
that.callback(null, msg, headers);
});
});
},
onWsupgrade: function (req, res) {
headers.request = req;
headers.response = res.headers;
},
onOpen: function (ws) {
ws.send(utils.encode('from client'));
}
});
},
"the target server should receive the message": function (err, msg, headers) {
assert.equal(msg, 'from client');
},
"the origin and sec-websocket-origin headers should match": function (err, msg, headers) {
assert.isString(headers.response['sec-websocket-location']);
assert.isTrue(headers.response['sec-websocket-location'].indexOf(wsprotocol) !== -1);
assert.equal(headers.request.Origin, headers.response['sec-websocket-origin']);
}
}
}
},
"When using server created by httpProxy.createServer()": {
"with no latency" : {
"when an inbound message is sent from a WebSocket client": {
Expand Down Expand Up @@ -114,6 +158,7 @@ vows.describe('node-http-proxy/websocket/' + wsprotocol).addBatch({
});
},
"should raise the `websocket:incoming` event": function (ign, data) {
console.log(ign,data,utils.decode(data))
assert.equal(utils.decode(data.toString().replace('\u0000', '')), 'from client');
},
},
Expand Down

0 comments on commit efa17ef

Please sign in to comment.