diff --git a/lib/node-http-proxy/http-proxy.js b/lib/node-http-proxy/http-proxy.js index 9b4ef59ee..faf133f31 100644 --- a/lib/node-http-proxy/http-proxy.js +++ b/lib/node-http-proxy/http-proxy.js @@ -128,9 +128,10 @@ HttpProxy.prototype.proxyRequest = function (req, res, buffer) { // * `x-forwarded-proto`: Protocol of the original request // * `x-forwarded-port`: Port of the original request. // - if (this.enable.xforward && req.connection && req.connection.socket) { - req.headers['x-forwarded-for'] = req.connection.remoteAddress || req.connection.socket.remoteAddress; - req.headers['x-forwarded-port'] = req.connection.remotePort || req.connection.socket.remotePort; + + if (this.enable.xforward && req.connection && req.socket) { + req.headers['x-forwarded-for'] = req.connection.remoteAddress || req.socket.remoteAddress; + req.headers['x-forwarded-port'] = req.connection.remotePort || req.socket.remotePort; req.headers['x-forwarded-proto'] = req.connection.pair ? 'https' : 'http'; } @@ -763,4 +764,4 @@ HttpProxy.prototype._forwardRequest = function (req) { req.on('end', function () { forwardProxy.end(); }); -}; \ No newline at end of file +}; diff --git a/test/helpers.js b/test/helpers.js index b1bbd2266..56ba4aaa3 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -128,6 +128,40 @@ TestRunner.prototype.assertResponseCode = function (proxyPort, statusCode, creat return test; }; +// A test helper to check and see if the http headers were set properly. +TestRunner.prototype.assertHeaders = function (proxyPort, headerName, createProxy) { + var assertion = "should receive http header \"" + headerName + "\"", + protocol = this.source.protocols.http; + + var test = { + topic: function () { + var that = this, options = { + method: 'GET', + uri: protocol + '://localhost:' + proxyPort, + headers: { + host: 'unknown.com' + } + }; + + if (createProxy) { + return createProxy(function () { + request(options, that.callback); + }); + } + + request(options, this.callback); + } + }; + + test[assertion] = function (err, res, body) { + assert.isNull(err); + assert.isNotNull(res.headers[headerName]); + }; + + return test; +}; + + // // WebSocketTest // @@ -368,4 +402,4 @@ function merge (target) { }); }); return target; -} \ No newline at end of file +} diff --git a/test/http/http-proxy-test.js b/test/http/http-proxy-test.js index c202f97c4..e3b08f9d9 100644 --- a/test/http/http-proxy-test.js +++ b/test/http/http-proxy-test.js @@ -74,8 +74,11 @@ vows.describe('node-http-proxy/http-proxy/' + testName).addBatch({ "and a valid target server": runner.assertProxied('localhost', 8120, 8121, function (callback) { runner.startProxyServerWithForwarding(8120, 8121, 'localhost', forwardOptions, callback); }), - "and without a valid forward server": runner.assertProxied('localhost', 8122, 8123, function (callback) { - runner.startProxyServerWithForwarding(8122, 8123, 'localhost', badForwardOptions, callback); + "and also a valid target server": runner.assertHeaders(8122, "x-forwarded-for", function (callback) { + runner.startProxyServerWithForwarding(8122, 8123, 'localhost', forwardOptions, callback); + }), + "and without a valid forward server": runner.assertProxied('localhost', 8124, 8125, function (callback) { + runner.startProxyServerWithForwarding(8124, 8125, 'localhost', badForwardOptions, callback); }) } }