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); + diff --git a/lib/node-http-proxy/http-proxy.js b/lib/node-http-proxy/http-proxy.js index 1ff76a6..8bbee09 100644 --- a/lib/node-http-proxy/http-proxy.js +++ b/lib/node-http-proxy/http-proxy.js @@ -195,6 +195,8 @@ HttpProxy.prototype.proxyRequest = function (req, res, buffer) { outgoing.path = req.url; outgoing.headers = req.headers; + 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 @@ -243,7 +245,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); @@ -296,6 +303,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. // diff --git a/package.json b/package.json index 84ea446..775c029 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "http-proxy", - "version": "0.7.3", + "version": "0.7.6", "description": "A full-featured http reverse proxy for node.js", "author": "Charlie Robbins ", "contributors": [