Permalink
Browse files

[fix] Change sec-websocket-location header when proxying WSS --> WS. …

…Added test coverage for this scenario
  • Loading branch information...
1 parent 76ecb51 commit 028d2044e71d70b7bc21d339de29e2275c3be5c2 @indexzero indexzero committed May 23, 2011
Showing with 15 additions and 0 deletions.
  1. +11 −0 lib/node-http-proxy.js
  2. +4 −0 test/web-socket-proxy-test.js
View
@@ -222,6 +222,7 @@ var HttpProxy = exports.HttpProxy = function (options) {
options = options || {};
options.target = options.target || {};
+ this.https = options.https;
this.forward = options.forward;
this.target = options.target;
this.changeOrigin = options.changeOrigin || false;
@@ -706,9 +707,19 @@ HttpProxy.prototype.proxyWebSocketRequest = function (req, socket, head, options
// Get the Non-Printable data
data = data.slice(Buffer.byteLength(sdata), data.length);
+ //
// Replace the host and origin headers in the Printable data
+ //
sdata = sdata.replace(remoteHost, options.host)
.replace(remoteHost, options.host);
+
+ if (self.https && !self.target.https) {
+ //
+ // If the proxy server is running HTTPS but the client is running
+ // HTTP then replace `ws` with `wss` in the data sent back to the client.
+ //
+ sdata = sdata.replace('ws:', 'wss:');
+ }
try {
//
@@ -87,6 +87,8 @@ vows.describe('node-http-proxy/websocket/' + wsprotocol).addBatch({
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']);
}
},
@@ -128,6 +130,8 @@ vows.describe('node-http-proxy/websocket/' + wsprotocol).addBatch({
assert.equal(msg, 'from server');
},
"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']);
}
}

0 comments on commit 028d204

Please sign in to comment.