A reverse proxy built on http-proxy that is configured by REST.
var http = require("http"),
server = http.createServer(),
dynamicProxy = require("dynamic-reverse-proxy")();
server.on("request", function (req, res) {
if (req.url.match(/^\/register/i)) {
dynamicProxy.registerRouteRequest(req, res);
}
else {
dynamicProxy.proxyRequest(req, res);
}
});
server.listen(3000, function () {
console.log("Reverse Proxy started, listening on port 3000");
});The reverse proxy is configured to route based on the first segment of the path. For example:
/would route to the host registered at//application1would route to the host registered at/application1/application2/test/index.htmlwould route to the host registered at/application2
To register the a host with the proxy:
POST /register HTTP/1.1
Host: localhost:3000
Content-Length: 28
Content-Type: application/json
{"prefix": "/", "port":1234}Now, any request made to http://localhost:3000/ will be sent to http://localhost:1234/.
To register another host:
POST /register HTTP/1.1
Host: localhost:3000
Content-Length: 32
Content-Type: application/json
{"prefix": "/test", "port":4321}Now, any request made to http://localhost:3000/test will be sent to http://localhost:4321/test.
Well, it's pretty lame (but functional) at the moment. Only requests originating from the same machine as the proxy are allowed to register.
The dynamic proxy object that is returned is an EventEmitter with the following events:
-
proxyErroris passed(error, host, request, response)and is emitted when:- A request is sent to a known host but the request could not be proxied (likely the host was unreachable). If no handler ends the response back to the original client,
500 Internal Server Errorwill be returned. - No host could be found to handle the request. In this case, the
errorwill beNOT_FOUND. If no handler ends the response back to the original client,501 Not Implementedwill be returned.
- A request is sent to a known host but the request could not be proxied (likely the host was unreachable). If no handler ends the response back to the original client,
-
registerErroris passed(error, request, response)and is emitted when a request is sent to/registerbut it could not be handled correctly. Error will be one of the following:FORBIDDEN(not allowed)METHOD_NOT_ALLOWED(must be a POST)BAD_REQUEST(not parsable as JSON)INCOMPLETE_REQUEST(path and port were not supplied)
-
routeRegisteredis passed(host)and is emitted when a request is sent to/registerand it was successful.
dynamicProxy.addRoutes(routes)adds an object of routes in the following format:
{
"/": {
"prefix": "",
"port": 1234
},
"/test": {
"prefix": "test",
"port": 4321
}
}