From 553e7fbc335a9befd166d472f057aa50452a9d40 Mon Sep 17 00:00:00 2001 From: "Ken \"Elf\" Mathieu Sternberg" Date: Tue, 29 Nov 2011 09:52:32 -0800 Subject: [PATCH 1/2] Modified the ad-hoc proxy lookup to use _getKey(), rather than the error-prone in-line method. _getKey() will look for options.target as well as options.host:options.port, and so is useful for a segmented proxy server where the destination proxies are not constructed before first references. --- lib/node-http-proxy/routing-proxy.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/node-http-proxy/routing-proxy.js b/lib/node-http-proxy/routing-proxy.js index 77b4a8d24..4e4fc32a5 100644 --- a/lib/node-http-proxy/routing-proxy.js +++ b/lib/node-http-proxy/routing-proxy.js @@ -180,8 +180,8 @@ RoutingProxy.prototype.proxyRequest = function (req, res, options) { options.host = location.host; } - var key = options.host + ':' + options.port, - proxy; + var key = this._getKey(options), + proxy; if (!this.proxies[key]) { this.add(options); @@ -218,8 +218,8 @@ RoutingProxy.prototype.proxyWebSocketRequest = function (req, socket, head, opti options.host = location.host; } - var key = options.host + ':' + options.port, - proxy; + var key = this._getKey(options), + proxy; if (!this.proxies[key]) { this.add(options); From 411bb51cc630d44c9d65b8a363fba52178cd081b Mon Sep 17 00:00:00 2001 From: "Ken \"Elf\" Mathieu Sternberg" Date: Tue, 29 Nov 2011 10:10:16 -0800 Subject: [PATCH 2/2] Fix issue where front-end is HTTPS, back-end is HTTP, and server issues a redirect. This handles the case where a back-end web application such as Django or Rails issues a redirect and automatically decorates the URL with the protocol with which it was addressed. If the back-ends are internal and HTTP-only, then they'll issue a URL with 'http://' as the protocol. This must be fixed before leaving the proxy. This also handles the (unusual) case where a back-end speaks only https://, but the user is deploying node-http-proxy to make that service available to non-SSL capable browsers. Works only with 301 and 302 codes. --- lib/node-http-proxy/http-proxy.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/node-http-proxy/http-proxy.js b/lib/node-http-proxy/http-proxy.js index 7724ddb1a..1c7842cb6 100644 --- a/lib/node-http-proxy/http-proxy.js +++ b/lib/node-http-proxy/http-proxy.js @@ -213,6 +213,15 @@ HttpProxy.prototype.proxyRequest = function (req, res, buffer) { delete response.headers['transfer-encoding']; } + if ((response.statusCode === 301) || (response.statusCode === 302)) { + if (self.source.https && !self.target.https) { + response.headers.location = response.headers.location.replace(/^http\:/, 'https:'); + } + if (self.target.https && !self.source.https) { + response.headers.location = response.headers.location.replace(/^https\:/, 'http:'); + } + } + // Set the headers of the client response res.writeHead(response.statusCode, response.headers);