From d4e91ebc33292a6da9057b7cb93443f10250481e Mon Sep 17 00:00:00 2001 From: blahed Date: Tue, 14 May 2013 03:10:11 -0400 Subject: [PATCH] determine x-forwarded-port from host header `req.remotePort' returns the ephemeral port, which is not useful. node v0.10.0 added `req.localPort' which returns what we want, but we want to maintain backwards compatibility. Fixes #341 & #227 --- lib/node-http-proxy/http-proxy.js | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/node-http-proxy/http-proxy.js b/lib/node-http-proxy/http-proxy.js index 494b8a9..f453db8 100644 --- a/lib/node-http-proxy/http-proxy.js +++ b/lib/node-http-proxy/http-proxy.js @@ -149,11 +149,11 @@ HttpProxy.prototype.proxyRequest = function (req, res, buffer) { } if (req.headers['x-forwarded-port']) { - var portToAppend = "," + req.connection.remotePort || req.socket.remotePort; + var portToAppend = "," + getPortFromHostHeader(req); req.headers['x-forwarded-port'] += portToAppend; } else { - req.headers['x-forwarded-port'] = req.connection.remotePort || req.socket.remotePort; + req.headers['x-forwarded-port'] = getPortFromHostHeader(req); } if (req.headers['x-forwarded-proto']) { @@ -489,11 +489,11 @@ HttpProxy.prototype.proxyWebSocketRequest = function (req, socket, upgradeHead, } if (req.headers['x-forwarded-port']) { - var portToAppend = "," + req.connection.remotePort || socket.remotePort; + var portToAppend = "," + getPortFromHostHeader(req); req.headers['x-forwarded-port'] += portToAppend; } else { - req.headers['x-forwarded-port'] = req.connection.remotePort || socket.remotePort; + req.headers['x-forwarded-port'] = getPortFromHostHeader(req); } if (req.headers['x-forwarded-proto']) { @@ -956,6 +956,17 @@ HttpProxy.prototype._forwardRequest = function (req) { }); }; +function getPortFromHostHeader(req) { + var portMatch = req.headers.host.match(/:(\d+)$/); + + if(portMatch) { + return parseInt(portMatch[1]); + } + else { + return getProto(req) === 'https' ? 443 : 80; + } +} + function getProto(req) { return req.isSpdy ? 'https' : (req.connection.pair ? 'https' : 'http'); }