An extensible, asynchronous HTTP reverse proxy and origin server.
Setup the server:
var argo = require('argo');
argo()
.use(function(handle) {
handle('response', function(env, next) {
env.response.setHeader('Access-Control-Allow-Origin', '*');
next(env);
});
})
.target('http://weather.yahooapis.com')
.listen(1337);
Make a request:
$ curl -i http://localhost:1337/forecastrss?w=2467861
HTTP/1.1 200 OK
Date: Thu, 28 Feb 2013 20:55:03 GMT
Content-Type: text/xml;charset=UTF-8
Connection: keep-alive
Server: YTS/1.20.13
Access-Control-Allow-Origin: *
Content-Length: 2337
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<GiantXMLResponse/>
Setup the server:
var argo = require('argo');
argo()
.get('/dogs', function(handle) {
handle('request', function(env, next) {
env.response.statusCode = 200;
env.response.body = { dogs: ['Alfred', 'Rover', 'Dino'] };
next(env);
});
})
.listen(1337);
Make a request:
$ curl -i http://localhost:1337/dogs
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 34
Date: Thu, 28 Feb 2013 20:44:46 GMT
Connection: keep-alive
{"dogs":["Alfred","Rover","Dino"]}
$ npm install argo
- handleFunction
- use(handleFunction)
- use(package)
- target
- route
- get
- post
- put
- del
- options
- trace
- map
- include
- listen
-
type
:'request'
or'response'
-
options
: Mostly used for internal purposes. Optional. -
callback(env, next)
: A request or response callback.env
is an environment context that is passed to every handler, andnext
is a reference to the next function in the pipeline.
When the handler is complete and wishes to pass to the next function in the pipeline, it must call next(env)
.
handleFunction
is used to set up request and response handlers.
argo()
//For every request add 'X-Custom-Header' with value 'Yippee!'
.use(function(handle) {
handle('request', function(env, next) {
env.request.headers['X-Custom-Header'] = 'Yippee!';
next(env);
});
})
Alias for include(package)
.
target
is used for proxying requests to a backend server.
uri
: a string pointing to the target URI.
Example:
argo()
.target('http://weather.yahooapis.com')
-
path
: a string used to match HTTP Request URI path. -
options
: an object with amethods
property to filter HTTP methods (e.g.,{ methods: ['GET','POST'] }
). Optional. -
handleFunction
: Same as inuse
.
Example:
argo()
.route('/greeting', function(handle) {
handle('request', function(env, next) {
env.response.statusCode = 200;
env.response.headers = { 'Content-Type': 'text/plain' };
env.response.body = 'Hello World!';
next(env);
});
})
Method filters built on top of route
.
Example:
argo()
.get('/puppies', function(handle) {
handle('request', function(env, next) {
env.response.body = JSON.stringify([{name: 'Sparky', breed: 'Fox Terrier' }]);
next(env);
});
})
map
is used to delegate control to sub-Argo instances based on a request URI path.
-
path
: a string used to match the HTTP Request URI path. -
options
: an object with amethods
property to filter HTTP methods (e.g.,{ methods: ['GET','POST'] }
). Optional. -
argoSegmentFunction
: a function that is passed an instance ofargo
for additional setup.
Example:
argo()
.map('/payments', function(server) {
server
.use(oauth)
.target('http://backend_payment_server');
})
package
: An object that contains apackage
property.
The package
property is a function that takes an argo instance as a paramter and returns an object that contains a name
and an install
function.
Example:
var superPackage = function(argo) {
return {
name: 'Super Package',
install: function() {
argo
.use(oauth)
.route('/super', require('./super'));
}
};
};
argo()
.include({ package: superPackage})
port
: A port on which the server should listen.
Unit tests:
$ npm test
Test Coverage:
$ npm run-script coverage
- HTTP Caching Support
- Collapsed Forwarding
- Parameterized Routing
- Rate Limiting
MIT