Commit 5d94ae27 authored by indexzero's avatar indexzero

[api] More changes for createServer api

parent 2e2b55f1
...@@ -21,39 +21,56 @@ Let's suppose you were running multiple http application servers, but you only w ...@@ -21,39 +21,56 @@ Let's suppose you were running multiple http application servers, but you only w
### Installing npm (node package manager) ### Installing npm (node package manager)
<pre>
curl http://npmjs.org/install.sh | sh curl http://npmjs.org/install.sh | sh
</pre>
### Installing node-http-proxy ### Installing node-http-proxy
<pre>
npm install http-proxy npm install http-proxy
</pre>
### How to use node-http-proxy ### How to use node-http-proxy
<pre>
var http = require('http'),
httpProxy = require('http-proxy');
var sys = require('sys'), httpProxy.createServer('localhost', '9000').listen(8000);
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){ http.createServer(function (req, res){
res.writeHead(200, {'Content-Type': 'text/plain'}); res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('request successfully proxied!' + '\n' + JSON.stringify(req.headers, true, 2)); res.write('request successfully proxied!' + '\n' + JSON.stringify(req.headers, true, 2));
res.end(); res.end();
}).listen(9000); }).listen(9000);
</pre>
see the [demo](http://github.com/nodejitsu/node-http-proxy/blob/master/demo.js) for further examples. see the [demo](http://github.com/nodejitsu/node-http-proxy/blob/master/demo.js) for further examples.
### How to use node-http-proxy with custom server logic
<pre>
var http = require('http'),
httpProxy = require('http-proxy');
httpProxy.createServer(function (req, res, proxy) {
//
// Put your custom server logic here
//
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);
</pre>
### Why doesn't node-http-proxy have more advanced features like x, y, or z? ### 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/> <br/><br/><br/><br/><br/>
### License ### License
(The MIT License) (The MIT License)
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
var sys = require('sys'), var sys = require('sys'),
colors = require('colors') colors = require('colors')
http = require('http'), http = require('http'),
httpProxy = require('http-proxy').httpProxy; httpProxy = require('http-proxy').HttpProxy;
// ascii art from http://github.com/marak/asciimo // ascii art from http://github.com/marak/asciimo
var welcome = '\ var welcome = '\
...@@ -40,17 +40,11 @@ var welcome = '\ ...@@ -40,17 +40,11 @@ var welcome = '\
sys.puts(welcome.rainbow.bold); sys.puts(welcome.rainbow.bold);
// create regular http proxy server // create regular http proxy server
http.createServer(function (req, res){ httpProxy.createServer('localhost', '9000').listen(8000);
var proxy = new httpProxy;
proxy.init(req, res);
proxy.proxyRequest('localhost', '9000', req, res);
}).listen(8000);
sys.puts('http proxy server'.blue + ' started '.green.bold + 'on port '.blue + '8000'.yellow); sys.puts('http proxy server'.blue + ' started '.green.bold + 'on port '.blue + '8000'.yellow);
// http proxy server with latency // http proxy server with latency
http.createServer(function (req, res){ httpProxy.createServer(function (req, res, proxy){
var proxy = new (httpProxy);
proxy.init(req, res);
setTimeout(function(){ setTimeout(function(){
proxy.proxyRequest('localhost', '9000', req, res); proxy.proxyRequest('localhost', '9000', req, res);
}, 200) }, 200)
......
...@@ -28,38 +28,90 @@ var sys = require('sys'), ...@@ -28,38 +28,90 @@ var sys = require('sys'),
http = require('http'), http = require('http'),
events = require('events'); events = require('events');
exports.httpProxy = function () { exports.HttpProxy = function () {
this.emitter = new(events.EventEmitter); this.emitter = new(events.EventEmitter);
// If we were passed more than two arguments, this.events = {};
// assume the first two are request and response. this.listeners = {};
if(arguments.length >= 2) {
this.init(arguments[0], arguments[1]);
}
}; };
exports.createServer = function(callback){ exports.createServer = function () {
sys.puts('httpProxy.createServer'); // Initialize the nodeProxy to start proxying requests
this.listen = function(host, port){ var proxy = new (exports.HttpProxy);
sys.puts(host + port); return proxy.createServer(arguments);
};
return this;
}; };
exports.HttpProxy.prototype = {
exports.httpProxy.prototype = { toArray: function (obj){
init: function (req, res) { var len = obj.length,
this.events = []; arr = new Array(len);
for (var i = 0; i < len; ++i) {
arr[i] = obj[i];
}
return arr;
},
createServer: function () {
var args = Array.prototype.slice.call(arguments),
self = this,
server,
port,
callback;
if (typeof(args[0]) === "function") {
callback = args[0];
}
else {
server = args[0];
port = args[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(server, port, req, res);
}
});
return proxyServer;
},
watch: function (req, res) {
var self = this; var self = this;
this.onData = function () { this.events[req] = [];
self.events.push(['data'].concat(self.toArray(arguments)));
}; this.listeners[req] = {
this.onEnd = function () { onData: function () {
self.events.push(['end'].concat(self.toArray(arguments))); 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('data', this.listeners[req].onData);
req.addListener('end', this.onEnd); 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 (server, port, req, res) {
...@@ -116,20 +168,6 @@ exports.httpProxy.prototype = { ...@@ -116,20 +168,6 @@ exports.httpProxy.prototype = {
reverse_proxy.end(); reverse_proxy.end();
}); });
req.removeListener('data', this.onData); this.unwatch(req, res);
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;
} }
}; };
{ {
"name": "http-proxy", "name": "http-proxy",
"description": "A full-featured http reverse proxy for node.js", "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>", "author": "Charlie Robbins <charlie.robbins@gmail.com>",
"contributors": [ "contributors": [
{ "name": "Marak Squires", "email": "marak.squires@gmail.com" } { "name": "Marak Squires", "email": "marak.squires@gmail.com" }
......
/* /*
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 Copyright (c) 2010 Charlie Robbins & Marak Squires http://github.com/nodejitsu/node-http-proxy
...@@ -31,28 +31,14 @@ var vows = require('vows'), ...@@ -31,28 +31,14 @@ var vows = require('vows'),
require.paths.unshift(require('path').join(__dirname, '../lib/')); require.paths.unshift(require('path').join(__dirname, '../lib/'));
var httpProxy = require('node-http-proxy').httpProxy; var HttpProxy = require('node-http-proxy').HttpProxy;
var testServers = {}; 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 // Creates the reverse proxy server
// //
var startProxyServer = function (server, port, proxy) { var startProxyServer = function (server, port, proxy) {
var proxyServer = http.createServer(function (req, res){ var proxyServer = proxy.createServer(server, port);
// Initialize the nodeProxy and start proxying the request
proxy.init(req, res);
proxy.proxyRequest(server, port, req, res);
});
proxyServer.listen(8080); proxyServer.listen(8080);
return proxyServer; return proxyServer;
}; };
...@@ -61,9 +47,8 @@ var startProxyServer = function (server, port, proxy) { ...@@ -61,9 +47,8 @@ var startProxyServer = function (server, port, proxy) {
// Creates the reverse proxy server with a specified latency // Creates the reverse proxy server with a specified latency
// //
var startLatentProxyServer = function (server, port, proxy, latency) { var startLatentProxyServer = function (server, port, proxy, latency) {
var proxyServer = http.createServer(function (req, res){ // Initialize the nodeProxy and start proxying the request
// Initialize the nodeProxy and start proxying the request var proxyServer = proxy.createServer(function (req, res, proxy) {
proxy.init(req, res);
setTimeout(function () { setTimeout(function () {
proxy.proxyRequest(server, port, req, res); proxy.proxyRequest(server, port, req, res);
}, latency); }, latency);
...@@ -78,8 +63,10 @@ var startLatentProxyServer = function (server, port, proxy, latency) { ...@@ -78,8 +63,10 @@ var startLatentProxyServer = function (server, port, proxy, latency) {
// //
var startTargetServer = function (port) { var startTargetServer = function (port) {
var targetServer = http.createServer(function (req, res) { 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); targetServer.listen(port);
return targetServer; return targetServer;
...@@ -107,7 +94,7 @@ vows.describe('node-proxy').addBatch({ ...@@ -107,7 +94,7 @@ vows.describe('node-proxy').addBatch({
"When an incoming request is proxied to the helloNode server" : { "When an incoming request is proxied to the helloNode server" : {
"with no latency" : { "with no latency" : {
topic: function () { topic: function () {
var proxy = new httpProxy; var proxy = new (HttpProxy);
startTest(proxy, 8082); startTest(proxy, 8082);
proxy.emitter.addListener('end', this.callback); proxy.emitter.addListener('end', this.callback);
...@@ -124,7 +111,7 @@ vows.describe('node-proxy').addBatch({ ...@@ -124,7 +111,7 @@ vows.describe('node-proxy').addBatch({
}, },
"with latency": { "with latency": {
topic: function () { topic: function () {
var proxy = new httpProxy; var proxy = new (HttpProxy);
startTestWithLatency(proxy, 8083); startTestWithLatency(proxy, 8083);
proxy.emitter.addListener('end', this.callback); proxy.emitter.addListener('end', this.callback);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment