From c773eedeb6d0b22e2b41ab9215cfdc064a8095e3 Mon Sep 17 00:00:00 2001 From: Dominic Tarr Date: Sun, 24 Jul 2011 23:17:24 +1000 Subject: [PATCH] [minor] add middleware to node-http-proxy --- lib/node-http-proxy.js | 89 ++++++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 33 deletions(-) diff --git a/lib/node-http-proxy.js b/lib/node-http-proxy.js index 227d06f..2e41b42 100644 --- a/lib/node-http-proxy.js +++ b/lib/node-http-proxy.js @@ -112,6 +112,30 @@ exports.getMaxSockets = function () { exports.setMaxSockets = function (value) { maxSockets = value; }; +// +// stack +// adapted from https://github.com/creationix/stack +// + +function stack (middlewares, proxy) { + var handle; + middlewares.reverse().forEach(function (layer) { + + var child = handle; + var next = function (err) { + if (err) { + throw err; + //return error(req, res, err); + } + child(req, res); + } + next.__proto__ = proxy; + handle = function (req, res) { + layer(req, res, next); + }; + }); + return handle; +} // // ### function createServer ([port, host, options, handler]) @@ -127,60 +151,59 @@ exports.setMaxSockets = function (value) { // exports.createServer = function () { var args = Array.prototype.slice.call(arguments), - callback = typeof args[0] === 'function' && args.shift(), - options = {}, port, host, forward, silent, proxy, server, handler; + callback, + options = {}, port, host, forward, silent, proxy, server, middleware = []; - if (args.length >= 2) { - port = args[0]; - host = args[1]; - options = args[2] || {}; - } - else if (args.length === 1) { - options = args[0] || {}; - if (!options.router && !callback) { - throw new Error('Cannot create server with no router and no callback'); - } - } + args.forEach(function (arg) { + + switch (typeof arg) { + case 'string': host = arg; break; + case 'number': port = arg; break; + case 'function': middleware.push(arg); break; + case 'object': options = arg; break; + }; + + }); - proxy = new HttpProxy(options); - - handler = function (req, res) { - if (callback) { - // - // If we were passed a callback to process the request - // or response in some way, then call it. - // - callback(req, res, proxy); - } - else if (port && host) { + var proxy = new HttpProxy(options); + + if(middleware.length) + //handler = callback = middleware.shift() + //else if (middleware.length) + handler = callback = stack(middleware, proxy); + + if (port && host) { // // If we have a target host and port for the request // then proxy to the specified location. // - proxy.proxyRequest(req, res, { - port: port, - host: host - }); + handler = function (req, res) { + proxy.proxyRequest(req, res, { + port: port, + host: host + }); + } } else if (proxy.proxyTable) { // // If the proxy is configured with a ProxyTable // instance then use that before failing. // - proxy.proxyRequest(req, res); + handler = function (req, res) { + proxy.proxyRequest(req, res); + } } - else { + else if (!handler) { // // Otherwise this server is improperly configured. // throw new Error('Cannot proxy without port, host, or router.') } - }; - + server = options.https ? https.createServer(options.https, handler) : http.createServer(handler); - + server.on('close', function () { proxy.close(); });