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'); }