From 6e65c20017a2e1a87dc6d58e847bc6db16440f3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Ma=C5=82ecki?= Date: Tue, 8 Nov 2011 17:05:33 +0100 Subject: [PATCH 1/9] [examples] Add some hand-crafted middleware --- .../middleware/modifyResponse-middleware.js | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 examples/middleware/modifyResponse-middleware.js diff --git a/examples/middleware/modifyResponse-middleware.js b/examples/middleware/modifyResponse-middleware.js new file mode 100644 index 0000000..af21236 --- /dev/null +++ b/examples/middleware/modifyResponse-middleware.js @@ -0,0 +1,57 @@ +/* + modifyBody-middleware.js: Example of middleware which modifies response + + Copyright (c) 2010 Charlie Robbins, Mikeal Rogers, Fedor Indutny, Marak Squires, & Dominic Tarr. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +var util = require('util'), + colors = require('colors'), + http = require('http'), + httpProxy = require('../../lib/node-http-proxy'); + +// +// Basic Http Proxy Server +// +httpProxy.createServer( + function (req, res, next) { + var _write = res.write; + + res.write = function (data) { + _write.call(res, data.toString().replace("Ruby", "nodejitsu")); + } + next(); + }, + 9000, 'localhost' +).listen(8000); + +// +// Target Http Server +// +http.createServer(function (req, res) { + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.end('Hello, I know Ruby\n'); +}).listen(9000); + +util.puts('http proxy server'.blue + ' started '.green.bold + 'on port '.blue + '8000'.yellow); +util.puts('http server '.blue + 'started '.green.bold + 'on port '.blue + '9000 '.yellow); + From 182dcd34555f361c1bb2b8d2777689e64ce32f87 Mon Sep 17 00:00:00 2001 From: Dominic Tarr Date: Thu, 10 Nov 2011 16:44:23 +1100 Subject: [PATCH 2/9] always emit end in 0.4 --- lib/node-http-proxy/http-proxy.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/node-http-proxy/http-proxy.js b/lib/node-http-proxy/http-proxy.js index a391102..8887972 100644 --- a/lib/node-http-proxy/http-proxy.js +++ b/lib/node-http-proxy/http-proxy.js @@ -266,7 +266,12 @@ HttpProxy.prototype.proxyRequest = function (req, res, buffer) { // already been called and the 'error' event listener // removed. // + var ended = false + response.on('close', function () { + if(!ended) response.emit('end') + }) response.on('end', function () { + ended = true if (!errState) { reverseProxy.removeListener('error', proxyError); From 3dfba2ba4591e0fcd65ff0bfd012b3ab749a0a02 Mon Sep 17 00:00:00 2001 From: Dominic Tarr Date: Thu, 10 Nov 2011 16:44:49 +1100 Subject: [PATCH 3/9] bump version 0.7.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 84ea446..f869088 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "http-proxy", - "version": "0.7.3", + "version": "0.7.4", "description": "A full-featured http reverse proxy for node.js", "author": "Charlie Robbins ", "contributors": [ From dd8319972c1c2f9421a90a21dce9560fd5ca199f Mon Sep 17 00:00:00 2001 From: bradleymeck Date: Wed, 9 Nov 2011 23:56:16 -0600 Subject: [PATCH 4/9] [example] Response modification middleware --- .../middleware/modifyResponse-middleware.js | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 examples/middleware/modifyResponse-middleware.js diff --git a/examples/middleware/modifyResponse-middleware.js b/examples/middleware/modifyResponse-middleware.js new file mode 100644 index 0000000..af21236 --- /dev/null +++ b/examples/middleware/modifyResponse-middleware.js @@ -0,0 +1,57 @@ +/* + modifyBody-middleware.js: Example of middleware which modifies response + + Copyright (c) 2010 Charlie Robbins, Mikeal Rogers, Fedor Indutny, Marak Squires, & Dominic Tarr. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +var util = require('util'), + colors = require('colors'), + http = require('http'), + httpProxy = require('../../lib/node-http-proxy'); + +// +// Basic Http Proxy Server +// +httpProxy.createServer( + function (req, res, next) { + var _write = res.write; + + res.write = function (data) { + _write.call(res, data.toString().replace("Ruby", "nodejitsu")); + } + next(); + }, + 9000, 'localhost' +).listen(8000); + +// +// Target Http Server +// +http.createServer(function (req, res) { + res.writeHead(200, { 'Content-Type': 'text/plain' }); + res.end('Hello, I know Ruby\n'); +}).listen(9000); + +util.puts('http proxy server'.blue + ' started '.green.bold + 'on port '.blue + '8000'.yellow); +util.puts('http server '.blue + 'started '.green.bold + 'on port '.blue + '9000 '.yellow); + From 65b7872e6ad433deae4de823c63629cb341bd649 Mon Sep 17 00:00:00 2001 From: Dominic Tarr Date: Fri, 11 Nov 2011 12:27:21 +1100 Subject: [PATCH 5/9] update outgoing.headers.host incase the destination does proxying --- lib/node-http-proxy/http-proxy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/node-http-proxy/http-proxy.js b/lib/node-http-proxy/http-proxy.js index 8887972..7279824 100644 --- a/lib/node-http-proxy/http-proxy.js +++ b/lib/node-http-proxy/http-proxy.js @@ -194,7 +194,7 @@ HttpProxy.prototype.proxyRequest = function (req, res, buffer) { outgoing.method = req.method; outgoing.path = req.url; outgoing.headers = req.headers; - + outgoing.headers.host = this.target.host + (this.target.port == 80 ? '' : ':' + this.target.port) // // Open new HTTP request to internal resource with will act // as a reverse proxy pass From b4d41c3628ade82792eb361b095ab014a88d537a Mon Sep 17 00:00:00 2001 From: Dominic Tarr Date: Fri, 11 Nov 2011 12:27:49 +1100 Subject: [PATCH 6/9] bump version 0.7.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f869088..d2d0dc2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "http-proxy", - "version": "0.7.4", + "version": "0.7.5", "description": "A full-featured http reverse proxy for node.js", "author": "Charlie Robbins ", "contributors": [ From f27d26f4515c900ea4cf1756ef279257a189e308 Mon Sep 17 00:00:00 2001 From: Dominic Tarr Date: Tue, 15 Nov 2011 07:41:00 +1100 Subject: [PATCH 7/9] changeOrigin option: set the host header to the proxy destination --- lib/node-http-proxy/http-proxy.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/node-http-proxy/http-proxy.js b/lib/node-http-proxy/http-proxy.js index 7279824..82bc533 100644 --- a/lib/node-http-proxy/http-proxy.js +++ b/lib/node-http-proxy/http-proxy.js @@ -194,7 +194,9 @@ HttpProxy.prototype.proxyRequest = function (req, res, buffer) { outgoing.method = req.method; outgoing.path = req.url; outgoing.headers = req.headers; - outgoing.headers.host = this.target.host + (this.target.port == 80 ? '' : ':' + this.target.port) + + if(this.changeOrigin) + outgoing.headers.host = this.target.host + (this.target.port == 80 ? '' : ':' + this.target.port) // // Open new HTTP request to internal resource with will act // as a reverse proxy pass From c5dc9295c711177c165bfb34c67407e1a5a0ed06 Mon Sep 17 00:00:00 2001 From: Dominic Tarr Date: Tue, 15 Nov 2011 07:43:43 +1100 Subject: [PATCH 8/9] bump version 0.7.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d2d0dc2..775c029 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "http-proxy", - "version": "0.7.5", + "version": "0.7.6", "description": "A full-featured http reverse proxy for node.js", "author": "Charlie Robbins ", "contributors": [ From c98ccb40e9fe5c5198a1605fa8835efc3ff1856c Mon Sep 17 00:00:00 2001 From: Camilo Aguilar Date: Tue, 15 Nov 2011 20:20:47 -0500 Subject: [PATCH 9/9] Fixes memory leak when clients abort connections --- lib/node-http-proxy/http-proxy.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/node-http-proxy/http-proxy.js b/lib/node-http-proxy/http-proxy.js index 82bc533..35ddb3d 100644 --- a/lib/node-http-proxy/http-proxy.js +++ b/lib/node-http-proxy/http-proxy.js @@ -326,6 +326,13 @@ HttpProxy.prototype.proxyRequest = function (req, res, buffer) { } }); + //Aborts reverseProxy if client aborts the connection. + req.on('close', function () { + if (!errState) { + reverseProxy.abort(); + } + }); + // // If we have been passed buffered data, resume it. //