diff --git a/lib/http-proxy/passes/ws-incoming.js b/lib/http-proxy/passes/ws-incoming.js index f51785749..1fea38da8 100644 --- a/lib/http-proxy/passes/ws-incoming.js +++ b/lib/http-proxy/passes/ws-incoming.js @@ -140,6 +140,7 @@ var passes = exports; server.emit('proxySocket', proxySocket); //DEPRECATED. }); + server.emit('proxyWsReq', proxyReq, req, socket); return proxyReq.end(); // XXX: CHECK IF THIS IS THIS CORRECT function onOutgoingError(err) { diff --git a/test/lib-http-proxy-passes-ws-incoming-test.js b/test/lib-http-proxy-passes-ws-incoming-test.js index bfed888c0..9aef20850 100644 --- a/test/lib-http-proxy-passes-ws-incoming-test.js +++ b/test/lib-http-proxy-passes-ws-incoming-test.js @@ -1,5 +1,7 @@ -var httpProxy = require('../lib/http-proxy/passes/ws-incoming'), - expect = require('expect.js'); +var wsPasses = require('../lib/http-proxy/passes/ws-incoming'), + expect = require('expect.js'), + http = require('http'), + httpProxy = require('../lib/http-proxy'); describe('lib/http-proxy/passes/ws-incoming.js', function () { describe('#checkMethodAndHeader', function () { @@ -9,13 +11,13 @@ describe('lib/http-proxy/passes/ws-incoming.js', function () { method: 'DELETE', headers: {} }, - stubSocket = { + stubSocket = { destroy: function () { // Simulate Socket.destroy() method when call destroyCalled = true; } } - returnValue = httpProxy.checkMethodAndHeader(stubRequest, stubSocket); + returnValue = wsPasses.checkMethodAndHeader(stubRequest, stubSocket); expect(returnValue).to.be(true); expect(destroyCalled).to.be(true); }) @@ -32,7 +34,7 @@ describe('lib/http-proxy/passes/ws-incoming.js', function () { destroyCalled = true; } } - returnValue = httpProxy.checkMethodAndHeader(stubRequest, stubSocket); + returnValue = wsPasses.checkMethodAndHeader(stubRequest, stubSocket); expect(returnValue).to.be(true); expect(destroyCalled).to.be(true); }) @@ -51,7 +53,7 @@ describe('lib/http-proxy/passes/ws-incoming.js', function () { destroyCalled = true; } } - returnValue = httpProxy.checkMethodAndHeader(stubRequest, stubSocket); + returnValue = wsPasses.checkMethodAndHeader(stubRequest, stubSocket); expect(returnValue).to.be(true); expect(destroyCalled).to.be(true); }) @@ -70,15 +72,70 @@ describe('lib/http-proxy/passes/ws-incoming.js', function () { destroyCalled = true; } } - returnValue = httpProxy.checkMethodAndHeader(stubRequest, stubSocket); + returnValue = wsPasses.checkMethodAndHeader(stubRequest, stubSocket); expect(returnValue).to.be(undefined); expect(destroyCalled).to.be(false); }) + + it('should detect a proxyWsReq event and modify headers', function (done) { + var proxy = httpProxy.createProxyServer({ + target: 'http://127.0.0.1:8080', + ws: true + }); + + proxy.on('proxyWsReq', function(proxyWsReq, req, res, options) { + proxyWsReq.setHeader('X-Special-Proxy-Header', 'foobar'); + }); + + function requestHandler(req, res) { + proxy.web(req, res); + } + + var proxyServer = http.createServer(requestHandler); + + proxyServer.on('upgrade', function(req, res, head){ + proxy.ws(req, res, head); + }); + + var source = http.createServer(function(req, res) { + res.end(); + }); + + source.on('upgrade', function(req, res, head){ + expect(req.headers['x-special-proxy-header']).to.eql('foobar'); + source.close(); + proxyServer.close(); + done(); + }); + + source.on('error', function(){}); + proxy.on('error', function(){}); + proxyServer.on('error', function(){}); + + proxyServer.listen('8081'); + source.listen('8080'); + + var request = http.request({ + host: '127.0.0.1', + port: '8081', + method: 'GET', + path: '/', + headers: { + 'upgrade': 'websocket', + 'connection': 'Upgrade', + 'sec-websocket-key': 'dGhlIHNhbXBsZSBub25jZQ==', + 'sec-websocket-protocol': 'chat, superchat', + 'sec-websocket-version': 13 + } + }, function() {}); + request.on('error', function(){}); + request.end(); + }); }); describe('#XHeaders', function () { it('return if no forward request', function () { - var returnValue = httpProxy.XHeaders({}, {}, {}); + var returnValue = wsPasses.XHeaders({}, {}, {}); expect(returnValue).to.be(undefined); }); @@ -91,8 +148,8 @@ describe('lib/http-proxy/passes/ws-incoming.js', function () { headers: { host: '192.168.1.2:8080' } - } - httpProxy.XHeaders(stubRequest, {}, { xfwd: true }); + }; + wsPasses.XHeaders(stubRequest, {}, { xfwd: true }); expect(stubRequest.headers['x-forwarded-for']).to.be('192.168.1.2'); expect(stubRequest.headers['x-forwarded-port']).to.be('8080'); expect(stubRequest.headers['x-forwarded-proto']).to.be('ws'); @@ -111,7 +168,7 @@ describe('lib/http-proxy/passes/ws-incoming.js', function () { host: '192.168.1.3:8181' } }; - httpProxy.XHeaders(stubRequest, {}, { xfwd: true }); + wsPasses.XHeaders(stubRequest, {}, { xfwd: true }); expect(stubRequest.headers['x-forwarded-for']).to.be('192.168.1.3'); expect(stubRequest.headers['x-forwarded-port']).to.be('8181'); expect(stubRequest.headers['x-forwarded-proto']).to.be('wss');