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
This commit is contained in:
blahed 2013-05-14 03:10:11 -04:00 committed by indexzero
parent 7e8041d2b6
commit d4e91ebc33

View File

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