mirror of
https://github.com/http-party/node-http-proxy.git
synced 2025-12-08 20:59:18 +00:00
merge
This commit is contained in:
commit
93505a422c
82
README.md
82
README.md
@ -21,39 +21,77 @@ Let's suppose you were running multiple http application servers, but you only w
|
||||
|
||||
|
||||
### Installing npm (node package manager)
|
||||
|
||||
curl http://npmjs.org/install.sh | sh
|
||||
<pre>
|
||||
curl http://npmjs.org/install.sh | sh
|
||||
</pre>
|
||||
|
||||
### Installing node-http-proxy
|
||||
<pre>
|
||||
npm install http-proxy
|
||||
</pre>
|
||||
|
||||
npm install http-proxy
|
||||
### How to setup a basic proxy server
|
||||
<pre>
|
||||
var http = require('http'),
|
||||
httpProxy = require('http-proxy');
|
||||
|
||||
httpProxy.createServer('9000', 'localhost').listen(8000);
|
||||
|
||||
### How to use node-http-proxy
|
||||
|
||||
var sys = require('sys'),
|
||||
colors = require('colors'),
|
||||
http = require('http'),
|
||||
httpProxy = require('http-proxy').httpProxy;
|
||||
|
||||
http.createServer(function (req, res){
|
||||
var proxy = new httpProxy;
|
||||
proxy.init(req, res);
|
||||
proxy.proxyRequest('localhost', '9000', req, res);
|
||||
}).listen(8000);
|
||||
|
||||
http.createServer(function (req, res){
|
||||
res.writeHead(200, {'Content-Type': 'text/plain'});
|
||||
res.write('request successfully proxied!' + '\n' + JSON.stringify(req.headers, true, 2));
|
||||
res.end();
|
||||
}).listen(9000);
|
||||
http.createServer(function (req, res){
|
||||
res.writeHead(200, {'Content-Type': 'text/plain'});
|
||||
res.write('request successfully proxied!' + '\n' + JSON.stringify(req.headers, true, 2));
|
||||
res.end();
|
||||
}).listen(9000);
|
||||
</pre>
|
||||
|
||||
see the [demo](http://github.com/nodejitsu/node-http-proxy/blob/master/demo.js) for further examples.
|
||||
|
||||
### How to setup a proxy server with custom server logic
|
||||
<pre>
|
||||
var http = require('http'),
|
||||
httpProxy = require('http-proxy');
|
||||
|
||||
// create a proxy server with custom application logic
|
||||
httpProxy.createServer(function (req, res, proxy) {
|
||||
// Put your custom server logic here
|
||||
proxy.proxyRequest('9000', 'localhost', req, res);
|
||||
}).listen(8000);
|
||||
|
||||
http.createServer(function (req, res){
|
||||
res.writeHead(200, {'Content-Type': 'text/plain'});
|
||||
res.write('request successfully proxied: ' + req.url +'\n' + JSON.stringify(req.headers, true, 2));
|
||||
res.end();
|
||||
}).listen(9000);
|
||||
|
||||
</pre>
|
||||
|
||||
### How to proxy requests with a regular http server
|
||||
<pre>
|
||||
var http = require('http'),
|
||||
httpProxy = require('http-proxy');
|
||||
|
||||
// create a regular http server and proxy its handler
|
||||
http.createServer(function (req, res){
|
||||
var proxy = new httpProxy.HttpProxy;
|
||||
proxy.watch(req, res);
|
||||
// Put your custom server logic here
|
||||
proxy.proxyRequest(9000, 'localhost', req, res);
|
||||
}).listen(8001);
|
||||
|
||||
http.createServer(function (req, res){
|
||||
res.writeHead(200, {'Content-Type': 'text/plain'});
|
||||
res.write('request successfully proxied: ' + req.url +'\n' + JSON.stringify(req.headers, true, 2));
|
||||
res.end();
|
||||
}).listen(9000);
|
||||
|
||||
</pre>
|
||||
|
||||
### Why doesn't node-http-proxy have more advanced features like x, y, or z?
|
||||
|
||||
if you have a suggestion for a feature currently not supported, feel free to open a [support issue](http://github.com/nodejitsu/node-http-proxy/issues). node-http-proxy is designed to just proxy http requests from one server to another, but we will be soon releasing many other complimentary projects that can be used in conjunction with node-http-proxy
|
||||
If you have a suggestion for a feature currently not supported, feel free to open a [support issue](http://github.com/nodejitsu/node-http-proxy/issues). node-http-proxy is designed to just proxy http requests from one server to another, but we will be soon releasing many other complimentary projects that can be used in conjunction with node-http-proxy.
|
||||
|
||||
<br/><br/><br/><br/><br/>
|
||||
|
||||
### License
|
||||
|
||||
(The MIT License)
|
||||
|
||||
32
demo.js
32
demo.js
@ -27,7 +27,7 @@
|
||||
var sys = require('sys'),
|
||||
colors = require('colors')
|
||||
http = require('http'),
|
||||
httpProxy = require('http-proxy').httpProxy;
|
||||
httpProxy = require('./lib/node-http-proxy');
|
||||
|
||||
// ascii art from http://github.com/marak/asciimo
|
||||
var welcome = '\
|
||||
@ -39,25 +39,31 @@ var welcome = '\
|
||||
# # # # # # # # #### # # # \n';
|
||||
sys.puts(welcome.rainbow.bold);
|
||||
|
||||
// create regular http proxy server
|
||||
http.createServer(function (req, res){
|
||||
var proxy = new httpProxy;
|
||||
proxy.init(req, res);
|
||||
proxy.proxyRequest('localhost', '9000', req, res);
|
||||
}).listen(8000);
|
||||
|
||||
/****** basic http proxy server ******/
|
||||
httpProxy.createServer(9000, 'localhost').listen(8000);
|
||||
sys.puts('http proxy server'.blue + ' started '.green.bold + 'on port '.blue + '8000'.yellow);
|
||||
|
||||
// http proxy server with latency
|
||||
http.createServer(function (req, res){
|
||||
var proxy = new (httpProxy);
|
||||
proxy.init(req, res);
|
||||
/****** http proxy server with latency******/
|
||||
httpProxy.createServer(function (req, res, proxy){
|
||||
setTimeout(function(){
|
||||
proxy.proxyRequest('localhost', '9000', req, res);
|
||||
proxy.proxyRequest(9000, 'localhost', req, res);
|
||||
}, 200)
|
||||
}).listen(8001);
|
||||
sys.puts('http proxy server '.blue + 'started '.green.bold + 'on port '.blue + '8001 '.yellow + 'with latency'.magenta.underline );
|
||||
|
||||
// create regular http server
|
||||
/****** http server with proxyRequest handler and latency******/
|
||||
http.createServer(function (req, res){
|
||||
var proxy = new httpProxy.HttpProxy;
|
||||
proxy.watch(req, res);
|
||||
|
||||
setTimeout(function(){
|
||||
proxy.proxyRequest(9000, 'localhost', req, res);
|
||||
}, 200);
|
||||
}).listen(8002);
|
||||
sys.puts('http server '.blue + 'started '.green.bold + 'on port '.blue + '8002 '.yellow + 'with proxyRequest handler'.cyan.underline + ' and latency'.magenta);
|
||||
|
||||
/****** regular http server ******/
|
||||
http.createServer(function (req, res){
|
||||
res.writeHead(200, {'Content-Type': 'text/plain'});
|
||||
res.write('request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2));
|
||||
|
||||
@ -28,41 +28,92 @@ var sys = require('sys'),
|
||||
http = require('http'),
|
||||
events = require('events');
|
||||
|
||||
exports.httpProxy = function () {
|
||||
exports.HttpProxy = function () {
|
||||
this.emitter = new(events.EventEmitter);
|
||||
// If we were passed more than two arguments,
|
||||
// assume the first two are request and response.
|
||||
if(arguments.length >= 2) {
|
||||
this.init(arguments[0], arguments[1]);
|
||||
}
|
||||
this.events = {};
|
||||
this.listeners = {};
|
||||
};
|
||||
|
||||
exports.createServer = function(callback){
|
||||
sys.puts('httpProxy.createServer');
|
||||
this.listen = function(host, port){
|
||||
sys.puts(host + port);
|
||||
};
|
||||
return this;
|
||||
exports.createServer = function () {
|
||||
// Initialize the nodeProxy to start proxying requests
|
||||
var proxy = new (exports.HttpProxy);
|
||||
return proxy.createServer.apply(proxy, arguments);
|
||||
};
|
||||
|
||||
|
||||
exports.httpProxy.prototype = {
|
||||
init: function (req, res) {
|
||||
this.events = [];
|
||||
exports.HttpProxy.prototype = {
|
||||
toArray: function (obj){
|
||||
var len = obj.length,
|
||||
arr = new Array(len);
|
||||
for (var i = 0; i < len; ++i) {
|
||||
arr[i] = obj[i];
|
||||
}
|
||||
return arr;
|
||||
},
|
||||
|
||||
createServer: function () {
|
||||
var self = this,
|
||||
server,
|
||||
port,
|
||||
callback;
|
||||
|
||||
if (typeof(arguments[0]) === "function") {
|
||||
callback = arguments[0];
|
||||
}
|
||||
else {
|
||||
port = arguments[0];
|
||||
server = arguments[1];
|
||||
}
|
||||
|
||||
var proxyServer = http.createServer(function (req, res){
|
||||
self.watch(req, res);
|
||||
|
||||
// If we were passed a callback to process the request
|
||||
// or response in some way, then call it.
|
||||
if(callback) {
|
||||
callback(req, res, self);
|
||||
}
|
||||
else {
|
||||
self.proxyRequest(port, server, req, res);
|
||||
}
|
||||
});
|
||||
|
||||
return proxyServer;
|
||||
},
|
||||
|
||||
watch: function (req, res) {
|
||||
var self = this;
|
||||
|
||||
this.onData = function () {
|
||||
self.events.push(['data'].concat(self.toArray(arguments)));
|
||||
};
|
||||
this.onEnd = function () {
|
||||
self.events.push(['end'].concat(self.toArray(arguments)));
|
||||
this.events[req] = [];
|
||||
|
||||
this.listeners[req] = {
|
||||
onData: function () {
|
||||
self.events[req].push(['data'].concat(self.toArray(arguments)));
|
||||
},
|
||||
onEnd: function () {
|
||||
self.events[req].push(['end'].concat(self.toArray(arguments)));
|
||||
}
|
||||
};
|
||||
|
||||
req.addListener('data', this.onData);
|
||||
req.addListener('end', this.onEnd);
|
||||
req.addListener('data', this.listeners[req].onData);
|
||||
req.addListener('end', this.listeners[req].onEnd);
|
||||
},
|
||||
|
||||
unwatch: function (req, res) {
|
||||
req.removeListener('data', this.listeners[req].onData);
|
||||
req.removeListener('end', this.listeners[req].onEnd);
|
||||
|
||||
// Rebroadcast any events that have been buffered
|
||||
while(this.events[req].length > 0) {
|
||||
var args = this.events[req].shift();
|
||||
req.emit.apply(req, args);
|
||||
}
|
||||
|
||||
// Remove the data from the event and listeners hashes
|
||||
delete this.listeners[req];
|
||||
delete this.events[req];
|
||||
},
|
||||
|
||||
proxyRequest: function (server, port, req, res) {
|
||||
proxyRequest: function (port, server, req, res) {
|
||||
// Remark: nodeProxy.body exists solely for testability
|
||||
this.body = '';
|
||||
var self = this;
|
||||
@ -116,20 +167,6 @@ exports.httpProxy.prototype = {
|
||||
reverse_proxy.end();
|
||||
});
|
||||
|
||||
req.removeListener('data', this.onData);
|
||||
req.removeListener('end', this.onEnd);
|
||||
|
||||
// Rebroadcast any events that have been buffered
|
||||
for (var i = 0, len = this.events.length; i < len; ++i) {
|
||||
req.emit.apply(req, this.events[i]);
|
||||
}
|
||||
},
|
||||
toArray: function (obj){
|
||||
var len = obj.length,
|
||||
arr = new Array(len);
|
||||
for (var i = 0; i < len; ++i) {
|
||||
arr[i] = obj[i];
|
||||
}
|
||||
return arr;
|
||||
this.unwatch(req, res);
|
||||
}
|
||||
};
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "http-proxy",
|
||||
"description": "A full-featured http reverse proxy for node.js",
|
||||
"version": "0.1.3",
|
||||
"version": "0.1.4",
|
||||
"author": "Charlie Robbins <charlie.robbins@gmail.com>",
|
||||
"contributors": [
|
||||
{ "name": "Marak Squires", "email": "marak.squires@gmail.com" }
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
node-http-proxy.js: http proxy for node.js
|
||||
node-http-proxy-test.js: http proxy for node.js
|
||||
|
||||
Copyright (c) 2010 Charlie Robbins & Marak Squires http://github.com/nodejitsu/node-http-proxy
|
||||
|
||||
@ -31,28 +31,14 @@ var vows = require('vows'),
|
||||
|
||||
require.paths.unshift(require('path').join(__dirname, '../lib/'));
|
||||
|
||||
var httpProxy = require('node-http-proxy').httpProxy;
|
||||
var httpProxy = require('node-http-proxy');
|
||||
var testServers = {};
|
||||
|
||||
//
|
||||
// Simple 'hello world' response for test purposes
|
||||
//
|
||||
var helloWorld = function(req, res) {
|
||||
res.writeHead(200, {'Content-Type': 'text/plain'});
|
||||
res.write('hello world')
|
||||
res.end();
|
||||
};
|
||||
|
||||
//
|
||||
// Creates the reverse proxy server
|
||||
//
|
||||
var startProxyServer = function (server, port, proxy) {
|
||||
var proxyServer = http.createServer(function (req, res){
|
||||
// Initialize the nodeProxy and start proxying the request
|
||||
proxy.init(req, res);
|
||||
proxy.proxyRequest(server, port, req, res);
|
||||
});
|
||||
|
||||
var startProxyServer = function (port, server, proxy) {
|
||||
var proxyServer = proxy.createServer(port, server);
|
||||
proxyServer.listen(8080);
|
||||
return proxyServer;
|
||||
};
|
||||
@ -60,12 +46,11 @@ var startProxyServer = function (server, port, proxy) {
|
||||
//
|
||||
// Creates the reverse proxy server with a specified latency
|
||||
//
|
||||
var startLatentProxyServer = function (server, port, proxy, latency) {
|
||||
var proxyServer = http.createServer(function (req, res){
|
||||
// Initialize the nodeProxy and start proxying the request
|
||||
proxy.init(req, res);
|
||||
var startLatentProxyServer = function (port, server, proxy, latency) {
|
||||
// Initialize the nodeProxy and start proxying the request
|
||||
var proxyServer = proxy.createServer(function (req, res, proxy) {
|
||||
setTimeout(function () {
|
||||
proxy.proxyRequest(server, port, req, res);
|
||||
proxy.proxyRequest(port, server, req, res);
|
||||
}, latency);
|
||||
});
|
||||
|
||||
@ -78,8 +63,10 @@ var startLatentProxyServer = function (server, port, proxy, latency) {
|
||||
//
|
||||
var startTargetServer = function (port) {
|
||||
var targetServer = http.createServer(function (req, res) {
|
||||
helloWorld(req, res);
|
||||
})
|
||||
res.writeHead(200, {'Content-Type': 'text/plain'});
|
||||
res.write('hello world')
|
||||
res.end();
|
||||
});
|
||||
|
||||
targetServer.listen(port);
|
||||
return targetServer;
|
||||
@ -90,7 +77,7 @@ var startTargetServer = function (port) {
|
||||
//
|
||||
var startTest = function (proxy, port) {
|
||||
testServers.noLatency = [];
|
||||
testServers.noLatency.push(startProxyServer('127.0.0.1', port, proxy));
|
||||
testServers.noLatency.push(startProxyServer(port, 'localhost', proxy));
|
||||
testServers.noLatency.push(startTargetServer(port));
|
||||
};
|
||||
|
||||
@ -99,44 +86,48 @@ var startTest = function (proxy, port) {
|
||||
//
|
||||
var startTestWithLatency = function (proxy, port) {
|
||||
testServers.latency = [];
|
||||
testServers.latency.push(startLatentProxyServer('127.0.0.1', port, proxy, 2000));
|
||||
testServers.latency.push(startLatentProxyServer(port, 'localhost', proxy, 2000));
|
||||
testServers.latency.push(startTargetServer(port));
|
||||
};
|
||||
|
||||
vows.describe('node-proxy').addBatch({
|
||||
"When an incoming request is proxied to the helloNode server" : {
|
||||
"with no latency" : {
|
||||
topic: function () {
|
||||
var proxy = new httpProxy;
|
||||
startTest(proxy, 8082);
|
||||
proxy.emitter.addListener('end', this.callback);
|
||||
vows.describe('node-http-proxy').addBatch({
|
||||
"A node-http-proxy": {
|
||||
"when instantiated directly": {
|
||||
"and an incoming request is proxied to the helloNode server" : {
|
||||
"with no latency" : {
|
||||
topic: function () {
|
||||
var proxy = new (httpProxy.HttpProxy);
|
||||
startTest(proxy, 8082);
|
||||
proxy.emitter.addListener('end', this.callback);
|
||||
|
||||
var client = http.createClient(8080, '127.0.0.1');
|
||||
var request = client.request('GET', '/');
|
||||
request.end();
|
||||
},
|
||||
"it should received 'hello world'": function (err, body) {
|
||||
assert.equal(body, 'hello world');
|
||||
testServers.noLatency.forEach(function (server) {
|
||||
server.close();
|
||||
})
|
||||
}
|
||||
},
|
||||
"with latency": {
|
||||
topic: function () {
|
||||
var proxy = new httpProxy;
|
||||
startTestWithLatency(proxy, 8083);
|
||||
proxy.emitter.addListener('end', this.callback);
|
||||
var client = http.createClient(8080, 'localhost');
|
||||
var request = client.request('GET', '/');
|
||||
request.end();
|
||||
},
|
||||
"it should received 'hello world'": function (err, body) {
|
||||
assert.equal(body, 'hello world');
|
||||
testServers.noLatency.forEach(function (server) {
|
||||
server.close();
|
||||
})
|
||||
}
|
||||
},
|
||||
"with latency": {
|
||||
topic: function () {
|
||||
var proxy = new (httpProxy.HttpProxy);
|
||||
startTestWithLatency(proxy, 8083);
|
||||
proxy.emitter.addListener('end', this.callback);
|
||||
|
||||
var client = http.createClient(8081, '127.0.0.1');
|
||||
var request = client.request('GET', '/');
|
||||
request.end();
|
||||
},
|
||||
"it should receive 'hello world'": function (err, body) {
|
||||
assert.equal(body, 'hello world');
|
||||
testServers.latency.forEach(function (server) {
|
||||
server.close();
|
||||
})
|
||||
var client = http.createClient(8081, 'localhost');
|
||||
var request = client.request('GET', '/');
|
||||
request.end();
|
||||
},
|
||||
"it should receive 'hello world'": function (err, body) {
|
||||
assert.equal(body, 'hello world');
|
||||
testServers.latency.forEach(function (server) {
|
||||
server.close();
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user