diff options
Diffstat (limited to 'vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/lib/node-http-proxy.js')
-rw-r--r-- | vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/lib/node-http-proxy.js | 397 |
1 files changed, 397 insertions, 0 deletions
diff --git a/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/lib/node-http-proxy.js b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/lib/node-http-proxy.js new file mode 100644 index 00000000..b5de6bb6 --- /dev/null +++ b/vnfmarket/src/main/webapp/vnfmarket/node_modules/http-proxy/lib/node-http-proxy.js @@ -0,0 +1,397 @@ +/* + node-http-proxy.js: http proxy for node.js + + Copyright (c) 2010 Charlie Robbins, Mikeal Rogers, Marak Squires, Fedor Indutny + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +var util = require('util'), + http = require('http'), + https = require('https'), + events = require('events'), + maxSockets = 100; + +// +// Expose version information through `pkginfo`. +// +require('pkginfo')(module, 'version'); + +// +// ### Export the relevant objects exposed by `node-http-proxy` +// +var HttpProxy = exports.HttpProxy = require('./node-http-proxy/http-proxy').HttpProxy, + ProxyTable = exports.ProxyTable = require('./node-http-proxy/proxy-table').ProxyTable, + RoutingProxy = exports.RoutingProxy = require('./node-http-proxy/routing-proxy').RoutingProxy; + +// +// ### function createServer ([port, host, options, handler]) +// #### @port {number} **Optional** Port to use on the proxy target host. +// #### @host {string} **Optional** Host of the proxy target. +// #### @options {Object} **Optional** Options for the HttpProxy instance used +// #### @handler {function} **Optional** Request handler for the server +// Returns a server that manages an instance of HttpProxy. Flexible arguments allow for: +// +// * `httpProxy.createServer(9000, 'localhost')` +// * `httpProxy.createServer(9000, 'localhost', options) +// * `httpPRoxy.createServer(function (req, res, proxy) { ... })` +// +exports.createServer = function () { + var args = Array.prototype.slice.call(arguments), + handlers = [], + callback, + options = {}, + message, + handler, + server, + proxy, + host, + port; + + // + // Liberally parse arguments of the form: + // + // httpProxy.createServer('localhost', 9000, callback); + // httpProxy.createServer({ host: 'localhost', port: 9000 }, callback); + // **NEED MORE HERE!!!** + // + args.forEach(function (arg) { + arg = Number(arg) || arg; + switch (typeof arg) { + case 'string': host = arg; break; + case 'number': port = arg; break; + case 'object': options = arg || {}; break; + case 'function': callback = arg; handlers.push(callback); break; + }; + }); + + // + // Helper function to create intelligent error message(s) + // for the very liberal arguments parsing performed by + // `require('http-proxy').createServer()`. + // + function validArguments() { + var conditions = { + 'port and host': function () { + return port && host; + }, + 'options.target or options.router': function () { + return options && (options.router || + (options.target && options.target.host && options.target.port)); + }, + 'or proxy handlers': function () { + return handlers && handlers.length; + } + } + + var missing = Object.keys(conditions).filter(function (name) { + return !conditions[name](); + }); + + if (missing.length === 3) { + message = 'Cannot proxy without ' + missing.join(', '); + return false; + } + + return true; + } + + if (!validArguments()) { + // + // If `host`, `port` and `options` are all not passed (with valid + // options) then this server is improperly configured. + // + throw new Error(message); + return; + } + + // + // Hoist up any explicit `host` or `port` arguments + // that have been passed in to the options we will + // pass to the `httpProxy.HttpProxy` constructor. + // + options.target = options.target || {}; + options.target.port = options.target.port || port; + options.target.host = options.target.host || host; + + if (options.target && options.target.host && options.target.port) { + // + // If an explicit `host` and `port` combination has been passed + // to `.createServer()` then instantiate a hot-path optimized + // `HttpProxy` object and add the "proxy" middleware layer. + // + proxy = new HttpProxy(options); + handlers.push(function (req, res) { + proxy.proxyRequest(req, res); + }); + } + else { + // + // If no explicit `host` or `port` combination has been passed then + // we have to assume that this is a "go-anywhere" Proxy (i.e. a `RoutingProxy`). + // + proxy = new RoutingProxy(options); + + if (options.router) { + // + // If a routing table has been supplied than we assume + // the user intends us to add the "proxy" middleware layer + // for them + // + handlers.push(function (req, res) { + proxy.proxyRequest(req, res); + }); + + proxy.on('routes', function (routes) { + server.emit('routes', routes); + }); + } + } + + // + // Create the `http[s].Server` instance which will use + // an instance of `httpProxy.HttpProxy`. + // + handler = handlers.length > 1 + ? exports.stack(handlers, proxy) + : function (req, res) { handlers[0](req, res, proxy) }; + + server = options.https + ? https.createServer(options.https, handler) + : http.createServer(handler); + + server.on('close', function () { + proxy.close(); + }); + + if (!callback) { + // + // If an explicit callback has not been supplied then + // automagically proxy the request using the `HttpProxy` + // instance we have created. + // + server.on('upgrade', function (req, socket, head) { + proxy.proxyWebSocketRequest(req, socket, head); + }); + } + + // + // Set the proxy on the server so it is available + // to the consumer of the server + // + server.proxy = proxy; + return server; +}; + +// +// ### function buffer (obj) +// #### @obj {Object} Object to pause events from +// Buffer `data` and `end` events from the given `obj`. +// Consumers of HttpProxy performing async tasks +// __must__ utilize this utility, to re-emit data once +// the async operation has completed, otherwise these +// __events will be lost.__ +// +// var buffer = httpProxy.buffer(req); +// fs.readFile(path, function () { +// httpProxy.proxyRequest(req, res, host, port, buffer); +// }); +// +// __Attribution:__ This approach is based heavily on +// [Connect](https://github.com/senchalabs/connect/blob/master/lib/utils.js#L157). +// However, this is not a big leap from the implementation in node-http-proxy < 0.4.0. +// This simply chooses to manage the scope of the events on a new Object literal as opposed to +// [on the HttpProxy instance](https://github.com/nodejitsu/node-http-proxy/blob/v0.3.1/lib/node-http-proxy.js#L154). +// +exports.buffer = function (obj) { + var events = [], + onData, + onEnd; + + obj.on('data', onData = function (data, encoding) { + events.push(['data', data, encoding]); + }); + + obj.on('end', onEnd = function (data, encoding) { + events.push(['end', data, encoding]); + }); + + return { + end: function () { + obj.removeListener('data', onData); + obj.removeListener('end', onEnd); + }, + destroy: function () { + this.end(); + this.resume = function () { + console.error("Cannot resume buffer after destroying it."); + }; + + onData = onEnd = events = obj = null; + }, + resume: function () { + this.end(); + for (var i = 0, len = events.length; i < len; ++i) { + obj.emit.apply(obj, events[i]); + } + } + }; +}; + +// +// ### function getMaxSockets () +// Returns the maximum number of sockets +// allowed on __every__ outgoing request +// made by __all__ instances of `HttpProxy` +// +exports.getMaxSockets = function () { + return maxSockets; +}; + +// +// ### function setMaxSockets () +// Sets the maximum number of sockets +// allowed on __every__ outgoing request +// made by __all__ instances of `HttpProxy` +// +exports.setMaxSockets = function (value) { + maxSockets = value; +}; + +// +// ### function stack (middlewares, proxy) +// #### @middlewares {Array} Array of functions to stack. +// #### @proxy {HttpProxy|RoutingProxy} Proxy instance to +// Iteratively build up a single handler to the `http.Server` +// `request` event (i.e. `function (req, res)`) by wrapping +// each middleware `layer` into a `child` middleware which +// is in invoked by the parent (i.e. predecessor in the Array). +// +// adapted from https://github.com/creationix/stack +// +exports.stack = function stack (middlewares, proxy) { + var handle; + middlewares.reverse().forEach(function (layer) { + var child = handle; + handle = function (req, res) { + var next = function (err) { + if (err) { + if (! proxy.emit('middlewareError', err, req, res)) { + console.error('Error in middleware(s): %s', err.stack); + } + + if (res._headerSent) { + res.destroy(); + } + else { + res.statusCode = 500; + res.setHeader('Content-Type', 'text/plain'); + res.end('Internal Server Error'); + } + + return; + } + + if (child) { + child(req, res); + } + }; + + // + // Set the prototype of the `next` function to the instance + // of the `proxy` so that in can be used interchangably from + // a `connect` style callback and a true `HttpProxy` object. + // + // e.g. `function (req, res, next)` vs. `function (req, res, proxy)` + // + next.__proto__ = proxy; + layer(req, res, next); + }; + }); + + return handle; +}; + +// +// ### function _getAgent (host, port, secure) +// #### @options {Object} Options to use when creating the agent. +// +// { +// host: 'localhost', +// port: 9000, +// https: true, +// maxSockets: 100 +// } +// +// Createsan agent from the `http` or `https` module +// and sets the `maxSockets` property appropriately. +// +exports._getAgent = function _getAgent (options) { + if (!options || !options.host) { + throw new Error('`options.host` is required to create an Agent.'); + } + + if (!options.port) { + options.port = options.https ? 443 : 80; + } + + var Agent = options.https ? https.Agent : http.Agent, + agent; + + // require('http-proxy').setMaxSockets() should override http's default + // configuration value (which is pretty low). + options.maxSockets = options.maxSockets || maxSockets; + agent = new Agent(options); + + return agent; +} + +// +// ### function _getProtocol (options) +// #### @options {Object} Options for the proxy target. +// Returns the appropriate node.js core protocol module (i.e. `http` or `https`) +// based on the `options` supplied. +// +exports._getProtocol = function _getProtocol (options) { + return options.https ? https : http; +}; + + +// +// ### function _getBase (options) +// #### @options {Object} Options for the proxy target. +// Returns the relevate base object to create on outgoing proxy request. +// If `options.https` are supplied, this function respond with an object +// containing the relevant `ca`, `key`, and `cert` properties. +// +exports._getBase = function _getBase (options) { + var result = function () {}; + + if (options.https && typeof options.https === 'object') { + ['ca', 'cert', 'key'].forEach(function (key) { + if (options.https[key]) { + result.prototype[key] = options.https[key]; + } + }); + } + + return result; +}; |