diff --git a/lib/node-http-proxy/http-proxy.js b/lib/node-http-proxy/http-proxy.js index 7724ddb1a..227948d1e 100644 --- a/lib/node-http-proxy/http-proxy.js +++ b/lib/node-http-proxy/http-proxy.js @@ -122,17 +122,36 @@ HttpProxy.prototype.proxyRequest = function (req, res, buffer) { // // Add common proxy headers to the request so that they can - // be availible to the proxy target server: + // be availible to the proxy target server. If the proxy is + // part of proxy chain it will append the address: // // * `x-forwarded-for`: IP Address of the original request // * `x-forwarded-proto`: Protocol of the original request // * `x-forwarded-port`: Port of the original request. // - 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'; + + if (req.headers['x-forwarded-for']){ + var addressToAppend = "," + req.connection.remoteAddress || req.socket.remoteAddress; + req.headers['x-forwarded-for'] += addressToAppend; + } else { + req.headers['x-forwarded-for'] = req.connection.remoteAddress || req.socket.remoteAddress; + } + + if (req.headers['x-forwarded-port']){ + var portToAppend = "," + req.connection.remotePort || req.socket.remotePort; + req.headers['x-forwarded-port'] += portToAppend; + } else { + req.headers['x-forwarded-port'] = req.connection.remotePort || req.socket.remotePort; + } + + if (req.headers['x-forwarded-proto']){ + var protoToAppend = "," + req.connection.pair ? 'https' : 'http'; + req.headers['x-forwarded-proto'] += protoToAppend; + } else { + req.headers['x-forwarded-proto'] = req.connection.pair ? 'https' : 'http'; + } + } // @@ -299,6 +318,7 @@ HttpProxy.prototype.proxyRequest = function (req, res, buffer) { // `req` write it to the `reverseProxy` request. // req.on('data', function (chunk) { + if (!errState) { var flushed = reverseProxy.write(chunk); if (!flushed) { @@ -375,16 +395,36 @@ HttpProxy.prototype.proxyWebSocketRequest = function (req, socket, head, buffer) // // Add common proxy headers to the request so that they can - // be availible to the proxy target server: + // be availible to the proxy target server. If the proxy is + // part of proxy chain it will append the address: // // * `x-forwarded-for`: IP Address of the original request // * `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; - req.headers['x-forwarded-proto'] = req.connection.pair ? 'https' : 'http'; + + if (req.headers['x-forwarded-for']){ + var addressToAppend = "," + req.connection.remoteAddress || req.connection.socket.remoteAddress; + req.headers['x-forwarded-for'] += addressToAppend; + } else { + req.headers['x-forwarded-for'] = req.connection.remoteAddress || req.connection.socket.remoteAddress; + } + + if (req.headers['x-forwarded-port']){ + var portToAppend = "," + req.connection.remotePort || req.connection.socket.remotePort; + req.headers['x-forwarded-port'] += portToAppend; + } else { + req.headers['x-forwarded-port'] = req.connection.remotePort || req.connection.socket.remotePort; + } + + if (req.headers['x-forwarded-proto']){ + var protoToAppend = "," + req.connection.pair ? 'https' : 'http'; + req.headers['x-forwarded-proto'] += protoToAppend; + } else { + req.headers['x-forwarded-proto'] = req.connection.pair ? 'https' : 'http'; + } + } //