mirror of
				https://github.com/1disk/edp445.git
				synced 2024-08-14 22:47:02 +00:00 
			
		
		
		
	added a few messages that the bot would respond to
This commit is contained in:
		
							parent
							
								
									c63d9a6e13
								
							
						
					
					
						commit
						de29e2769c
					
				
					 384 changed files with 56249 additions and 43 deletions
				
			
		
							
								
								
									
										661
									
								
								node_modules/express/lib/application.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										661
									
								
								node_modules/express/lib/application.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,661 @@ | |||
| /*! | ||||
|  * express | ||||
|  * Copyright(c) 2009-2013 TJ Holowaychuk | ||||
|  * Copyright(c) 2013 Roman Shtylman | ||||
|  * Copyright(c) 2014-2015 Douglas Christopher Wilson | ||||
|  * MIT Licensed | ||||
|  */ | ||||
| 
 | ||||
| 'use strict'; | ||||
| 
 | ||||
| /** | ||||
|  * Module dependencies. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| var finalhandler = require('finalhandler'); | ||||
| var Router = require('./router'); | ||||
| var methods = require('methods'); | ||||
| var middleware = require('./middleware/init'); | ||||
| var query = require('./middleware/query'); | ||||
| var debug = require('debug')('express:application'); | ||||
| var View = require('./view'); | ||||
| var http = require('http'); | ||||
| var compileETag = require('./utils').compileETag; | ||||
| var compileQueryParser = require('./utils').compileQueryParser; | ||||
| var compileTrust = require('./utils').compileTrust; | ||||
| var deprecate = require('depd')('express'); | ||||
| var flatten = require('array-flatten'); | ||||
| var merge = require('utils-merge'); | ||||
| var resolve = require('path').resolve; | ||||
| var setPrototypeOf = require('setprototypeof') | ||||
| 
 | ||||
| /** | ||||
|  * Module variables. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| var hasOwnProperty = Object.prototype.hasOwnProperty | ||||
| var slice = Array.prototype.slice; | ||||
| 
 | ||||
| /** | ||||
|  * Application prototype. | ||||
|  */ | ||||
| 
 | ||||
| var app = exports = module.exports = {}; | ||||
| 
 | ||||
| /** | ||||
|  * Variable for trust proxy inheritance back-compat | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| var trustProxyDefaultSymbol = '@@symbol:trust_proxy_default'; | ||||
| 
 | ||||
| /** | ||||
|  * Initialize the server. | ||||
|  * | ||||
|  *   - setup default configuration | ||||
|  *   - setup default middleware | ||||
|  *   - setup route reflection methods | ||||
|  * | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| app.init = function init() { | ||||
|   this.cache = {}; | ||||
|   this.engines = {}; | ||||
|   this.settings = {}; | ||||
| 
 | ||||
|   this.defaultConfiguration(); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Initialize application configuration. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| app.defaultConfiguration = function defaultConfiguration() { | ||||
|   var env = process.env.NODE_ENV || 'development'; | ||||
| 
 | ||||
|   // default settings
 | ||||
|   this.enable('x-powered-by'); | ||||
|   this.set('etag', 'weak'); | ||||
|   this.set('env', env); | ||||
|   this.set('query parser', 'extended'); | ||||
|   this.set('subdomain offset', 2); | ||||
|   this.set('trust proxy', false); | ||||
| 
 | ||||
|   // trust proxy inherit back-compat
 | ||||
|   Object.defineProperty(this.settings, trustProxyDefaultSymbol, { | ||||
|     configurable: true, | ||||
|     value: true | ||||
|   }); | ||||
| 
 | ||||
|   debug('booting in %s mode', env); | ||||
| 
 | ||||
|   this.on('mount', function onmount(parent) { | ||||
|     // inherit trust proxy
 | ||||
|     if (this.settings[trustProxyDefaultSymbol] === true | ||||
|       && typeof parent.settings['trust proxy fn'] === 'function') { | ||||
|       delete this.settings['trust proxy']; | ||||
|       delete this.settings['trust proxy fn']; | ||||
|     } | ||||
| 
 | ||||
|     // inherit protos
 | ||||
|     setPrototypeOf(this.request, parent.request) | ||||
|     setPrototypeOf(this.response, parent.response) | ||||
|     setPrototypeOf(this.engines, parent.engines) | ||||
|     setPrototypeOf(this.settings, parent.settings) | ||||
|   }); | ||||
| 
 | ||||
|   // setup locals
 | ||||
|   this.locals = Object.create(null); | ||||
| 
 | ||||
|   // top-most app is mounted at /
 | ||||
|   this.mountpath = '/'; | ||||
| 
 | ||||
|   // default locals
 | ||||
|   this.locals.settings = this.settings; | ||||
| 
 | ||||
|   // default configuration
 | ||||
|   this.set('view', View); | ||||
|   this.set('views', resolve('views')); | ||||
|   this.set('jsonp callback name', 'callback'); | ||||
| 
 | ||||
|   if (env === 'production') { | ||||
|     this.enable('view cache'); | ||||
|   } | ||||
| 
 | ||||
|   Object.defineProperty(this, 'router', { | ||||
|     get: function() { | ||||
|       throw new Error('\'app.router\' is deprecated!\nPlease see the 3.x to 4.x migration guide for details on how to update your app.'); | ||||
|     } | ||||
|   }); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * lazily adds the base router if it has not yet been added. | ||||
|  * | ||||
|  * We cannot add the base router in the defaultConfiguration because | ||||
|  * it reads app settings which might be set after that has run. | ||||
|  * | ||||
|  * @private | ||||
|  */ | ||||
| app.lazyrouter = function lazyrouter() { | ||||
|   if (!this._router) { | ||||
|     this._router = new Router({ | ||||
|       caseSensitive: this.enabled('case sensitive routing'), | ||||
|       strict: this.enabled('strict routing') | ||||
|     }); | ||||
| 
 | ||||
|     this._router.use(query(this.get('query parser fn'))); | ||||
|     this._router.use(middleware.init(this)); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Dispatch a req, res pair into the application. Starts pipeline processing. | ||||
|  * | ||||
|  * If no callback is provided, then default error handlers will respond | ||||
|  * in the event of an error bubbling through the stack. | ||||
|  * | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| app.handle = function handle(req, res, callback) { | ||||
|   var router = this._router; | ||||
| 
 | ||||
|   // final handler
 | ||||
|   var done = callback || finalhandler(req, res, { | ||||
|     env: this.get('env'), | ||||
|     onerror: logerror.bind(this) | ||||
|   }); | ||||
| 
 | ||||
|   // no routes
 | ||||
|   if (!router) { | ||||
|     debug('no routes defined on app'); | ||||
|     done(); | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   router.handle(req, res, done); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Proxy `Router#use()` to add middleware to the app router. | ||||
|  * See Router#use() documentation for details. | ||||
|  * | ||||
|  * If the _fn_ parameter is an express app, then it will be | ||||
|  * mounted at the _route_ specified. | ||||
|  * | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| app.use = function use(fn) { | ||||
|   var offset = 0; | ||||
|   var path = '/'; | ||||
| 
 | ||||
|   // default path to '/'
 | ||||
|   // disambiguate app.use([fn])
 | ||||
|   if (typeof fn !== 'function') { | ||||
|     var arg = fn; | ||||
| 
 | ||||
|     while (Array.isArray(arg) && arg.length !== 0) { | ||||
|       arg = arg[0]; | ||||
|     } | ||||
| 
 | ||||
|     // first arg is the path
 | ||||
|     if (typeof arg !== 'function') { | ||||
|       offset = 1; | ||||
|       path = fn; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   var fns = flatten(slice.call(arguments, offset)); | ||||
| 
 | ||||
|   if (fns.length === 0) { | ||||
|     throw new TypeError('app.use() requires a middleware function') | ||||
|   } | ||||
| 
 | ||||
|   // setup router
 | ||||
|   this.lazyrouter(); | ||||
|   var router = this._router; | ||||
| 
 | ||||
|   fns.forEach(function (fn) { | ||||
|     // non-express app
 | ||||
|     if (!fn || !fn.handle || !fn.set) { | ||||
|       return router.use(path, fn); | ||||
|     } | ||||
| 
 | ||||
|     debug('.use app under %s', path); | ||||
|     fn.mountpath = path; | ||||
|     fn.parent = this; | ||||
| 
 | ||||
|     // restore .app property on req and res
 | ||||
|     router.use(path, function mounted_app(req, res, next) { | ||||
|       var orig = req.app; | ||||
|       fn.handle(req, res, function (err) { | ||||
|         setPrototypeOf(req, orig.request) | ||||
|         setPrototypeOf(res, orig.response) | ||||
|         next(err); | ||||
|       }); | ||||
|     }); | ||||
| 
 | ||||
|     // mounted an app
 | ||||
|     fn.emit('mount', this); | ||||
|   }, this); | ||||
| 
 | ||||
|   return this; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Proxy to the app `Router#route()` | ||||
|  * Returns a new `Route` instance for the _path_. | ||||
|  * | ||||
|  * Routes are isolated middleware stacks for specific paths. | ||||
|  * See the Route api docs for details. | ||||
|  * | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| app.route = function route(path) { | ||||
|   this.lazyrouter(); | ||||
|   return this._router.route(path); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Register the given template engine callback `fn` | ||||
|  * as `ext`. | ||||
|  * | ||||
|  * By default will `require()` the engine based on the | ||||
|  * file extension. For example if you try to render | ||||
|  * a "foo.ejs" file Express will invoke the following internally: | ||||
|  * | ||||
|  *     app.engine('ejs', require('ejs').__express); | ||||
|  * | ||||
|  * For engines that do not provide `.__express` out of the box, | ||||
|  * or if you wish to "map" a different extension to the template engine | ||||
|  * you may use this method. For example mapping the EJS template engine to | ||||
|  * ".html" files: | ||||
|  * | ||||
|  *     app.engine('html', require('ejs').renderFile); | ||||
|  * | ||||
|  * In this case EJS provides a `.renderFile()` method with | ||||
|  * the same signature that Express expects: `(path, options, callback)`, | ||||
|  * though note that it aliases this method as `ejs.__express` internally | ||||
|  * so if you're using ".ejs" extensions you don't need to do anything. | ||||
|  * | ||||
|  * Some template engines do not follow this convention, the | ||||
|  * [Consolidate.js](https://github.com/tj/consolidate.js)
 | ||||
|  * library was created to map all of node's popular template | ||||
|  * engines to follow this convention, thus allowing them to | ||||
|  * work seamlessly within Express. | ||||
|  * | ||||
|  * @param {String} ext | ||||
|  * @param {Function} fn | ||||
|  * @return {app} for chaining | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| app.engine = function engine(ext, fn) { | ||||
|   if (typeof fn !== 'function') { | ||||
|     throw new Error('callback function required'); | ||||
|   } | ||||
| 
 | ||||
|   // get file extension
 | ||||
|   var extension = ext[0] !== '.' | ||||
|     ? '.' + ext | ||||
|     : ext; | ||||
| 
 | ||||
|   // store engine
 | ||||
|   this.engines[extension] = fn; | ||||
| 
 | ||||
|   return this; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Proxy to `Router#param()` with one added api feature. The _name_ parameter | ||||
|  * can be an array of names. | ||||
|  * | ||||
|  * See the Router#param() docs for more details. | ||||
|  * | ||||
|  * @param {String|Array} name | ||||
|  * @param {Function} fn | ||||
|  * @return {app} for chaining | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| app.param = function param(name, fn) { | ||||
|   this.lazyrouter(); | ||||
| 
 | ||||
|   if (Array.isArray(name)) { | ||||
|     for (var i = 0; i < name.length; i++) { | ||||
|       this.param(name[i], fn); | ||||
|     } | ||||
| 
 | ||||
|     return this; | ||||
|   } | ||||
| 
 | ||||
|   this._router.param(name, fn); | ||||
| 
 | ||||
|   return this; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Assign `setting` to `val`, or return `setting`'s value. | ||||
|  * | ||||
|  *    app.set('foo', 'bar'); | ||||
|  *    app.set('foo'); | ||||
|  *    // => "bar"
 | ||||
|  * | ||||
|  * Mounted servers inherit their parent server's settings. | ||||
|  * | ||||
|  * @param {String} setting | ||||
|  * @param {*} [val] | ||||
|  * @return {Server} for chaining | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| app.set = function set(setting, val) { | ||||
|   if (arguments.length === 1) { | ||||
|     // app.get(setting)
 | ||||
|     var settings = this.settings | ||||
| 
 | ||||
|     while (settings && settings !== Object.prototype) { | ||||
|       if (hasOwnProperty.call(settings, setting)) { | ||||
|         return settings[setting] | ||||
|       } | ||||
| 
 | ||||
|       settings = Object.getPrototypeOf(settings) | ||||
|     } | ||||
| 
 | ||||
|     return undefined | ||||
|   } | ||||
| 
 | ||||
|   debug('set "%s" to %o', setting, val); | ||||
| 
 | ||||
|   // set value
 | ||||
|   this.settings[setting] = val; | ||||
| 
 | ||||
|   // trigger matched settings
 | ||||
|   switch (setting) { | ||||
|     case 'etag': | ||||
|       this.set('etag fn', compileETag(val)); | ||||
|       break; | ||||
|     case 'query parser': | ||||
|       this.set('query parser fn', compileQueryParser(val)); | ||||
|       break; | ||||
|     case 'trust proxy': | ||||
|       this.set('trust proxy fn', compileTrust(val)); | ||||
| 
 | ||||
|       // trust proxy inherit back-compat
 | ||||
|       Object.defineProperty(this.settings, trustProxyDefaultSymbol, { | ||||
|         configurable: true, | ||||
|         value: false | ||||
|       }); | ||||
| 
 | ||||
|       break; | ||||
|   } | ||||
| 
 | ||||
|   return this; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Return the app's absolute pathname | ||||
|  * based on the parent(s) that have | ||||
|  * mounted it. | ||||
|  * | ||||
|  * For example if the application was | ||||
|  * mounted as "/admin", which itself | ||||
|  * was mounted as "/blog" then the | ||||
|  * return value would be "/blog/admin". | ||||
|  * | ||||
|  * @return {String} | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| app.path = function path() { | ||||
|   return this.parent | ||||
|     ? this.parent.path() + this.mountpath | ||||
|     : ''; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Check if `setting` is enabled (truthy). | ||||
|  * | ||||
|  *    app.enabled('foo') | ||||
|  *    // => false
 | ||||
|  * | ||||
|  *    app.enable('foo') | ||||
|  *    app.enabled('foo') | ||||
|  *    // => true
 | ||||
|  * | ||||
|  * @param {String} setting | ||||
|  * @return {Boolean} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| app.enabled = function enabled(setting) { | ||||
|   return Boolean(this.set(setting)); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Check if `setting` is disabled. | ||||
|  * | ||||
|  *    app.disabled('foo') | ||||
|  *    // => true
 | ||||
|  * | ||||
|  *    app.enable('foo') | ||||
|  *    app.disabled('foo') | ||||
|  *    // => false
 | ||||
|  * | ||||
|  * @param {String} setting | ||||
|  * @return {Boolean} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| app.disabled = function disabled(setting) { | ||||
|   return !this.set(setting); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Enable `setting`. | ||||
|  * | ||||
|  * @param {String} setting | ||||
|  * @return {app} for chaining | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| app.enable = function enable(setting) { | ||||
|   return this.set(setting, true); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Disable `setting`. | ||||
|  * | ||||
|  * @param {String} setting | ||||
|  * @return {app} for chaining | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| app.disable = function disable(setting) { | ||||
|   return this.set(setting, false); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Delegate `.VERB(...)` calls to `router.VERB(...)`. | ||||
|  */ | ||||
| 
 | ||||
| methods.forEach(function(method){ | ||||
|   app[method] = function(path){ | ||||
|     if (method === 'get' && arguments.length === 1) { | ||||
|       // app.get(setting)
 | ||||
|       return this.set(path); | ||||
|     } | ||||
| 
 | ||||
|     this.lazyrouter(); | ||||
| 
 | ||||
|     var route = this._router.route(path); | ||||
|     route[method].apply(route, slice.call(arguments, 1)); | ||||
|     return this; | ||||
|   }; | ||||
| }); | ||||
| 
 | ||||
| /** | ||||
|  * Special-cased "all" method, applying the given route `path`, | ||||
|  * middleware, and callback to _every_ HTTP method. | ||||
|  * | ||||
|  * @param {String} path | ||||
|  * @param {Function} ... | ||||
|  * @return {app} for chaining | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| app.all = function all(path) { | ||||
|   this.lazyrouter(); | ||||
| 
 | ||||
|   var route = this._router.route(path); | ||||
|   var args = slice.call(arguments, 1); | ||||
| 
 | ||||
|   for (var i = 0; i < methods.length; i++) { | ||||
|     route[methods[i]].apply(route, args); | ||||
|   } | ||||
| 
 | ||||
|   return this; | ||||
| }; | ||||
| 
 | ||||
| // del -> delete alias
 | ||||
| 
 | ||||
| app.del = deprecate.function(app.delete, 'app.del: Use app.delete instead'); | ||||
| 
 | ||||
| /** | ||||
|  * Render the given view `name` name with `options` | ||||
|  * and a callback accepting an error and the | ||||
|  * rendered template string. | ||||
|  * | ||||
|  * Example: | ||||
|  * | ||||
|  *    app.render('email', { name: 'Tobi' }, function(err, html){ | ||||
|  *      // ...
 | ||||
|  *    }) | ||||
|  * | ||||
|  * @param {String} name | ||||
|  * @param {Object|Function} options or fn | ||||
|  * @param {Function} callback | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| app.render = function render(name, options, callback) { | ||||
|   var cache = this.cache; | ||||
|   var done = callback; | ||||
|   var engines = this.engines; | ||||
|   var opts = options; | ||||
|   var renderOptions = {}; | ||||
|   var view; | ||||
| 
 | ||||
|   // support callback function as second arg
 | ||||
|   if (typeof options === 'function') { | ||||
|     done = options; | ||||
|     opts = {}; | ||||
|   } | ||||
| 
 | ||||
|   // merge app.locals
 | ||||
|   merge(renderOptions, this.locals); | ||||
| 
 | ||||
|   // merge options._locals
 | ||||
|   if (opts._locals) { | ||||
|     merge(renderOptions, opts._locals); | ||||
|   } | ||||
| 
 | ||||
|   // merge options
 | ||||
|   merge(renderOptions, opts); | ||||
| 
 | ||||
|   // set .cache unless explicitly provided
 | ||||
|   if (renderOptions.cache == null) { | ||||
|     renderOptions.cache = this.enabled('view cache'); | ||||
|   } | ||||
| 
 | ||||
|   // primed cache
 | ||||
|   if (renderOptions.cache) { | ||||
|     view = cache[name]; | ||||
|   } | ||||
| 
 | ||||
|   // view
 | ||||
|   if (!view) { | ||||
|     var View = this.get('view'); | ||||
| 
 | ||||
|     view = new View(name, { | ||||
|       defaultEngine: this.get('view engine'), | ||||
|       root: this.get('views'), | ||||
|       engines: engines | ||||
|     }); | ||||
| 
 | ||||
|     if (!view.path) { | ||||
|       var dirs = Array.isArray(view.root) && view.root.length > 1 | ||||
|         ? 'directories "' + view.root.slice(0, -1).join('", "') + '" or "' + view.root[view.root.length - 1] + '"' | ||||
|         : 'directory "' + view.root + '"' | ||||
|       var err = new Error('Failed to lookup view "' + name + '" in views ' + dirs); | ||||
|       err.view = view; | ||||
|       return done(err); | ||||
|     } | ||||
| 
 | ||||
|     // prime the cache
 | ||||
|     if (renderOptions.cache) { | ||||
|       cache[name] = view; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // render
 | ||||
|   tryRender(view, renderOptions, done); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Listen for connections. | ||||
|  * | ||||
|  * A node `http.Server` is returned, with this | ||||
|  * application (which is a `Function`) as its | ||||
|  * callback. If you wish to create both an HTTP | ||||
|  * and HTTPS server you may do so with the "http" | ||||
|  * and "https" modules as shown here: | ||||
|  * | ||||
|  *    var http = require('http') | ||||
|  *      , https = require('https') | ||||
|  *      , express = require('express') | ||||
|  *      , app = express(); | ||||
|  * | ||||
|  *    http.createServer(app).listen(80); | ||||
|  *    https.createServer({ ... }, app).listen(443); | ||||
|  * | ||||
|  * @return {http.Server} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| app.listen = function listen() { | ||||
|   var server = http.createServer(this); | ||||
|   return server.listen.apply(server, arguments); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Log error using console.error. | ||||
|  * | ||||
|  * @param {Error} err | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| function logerror(err) { | ||||
|   /* istanbul ignore next */ | ||||
|   if (this.get('env') !== 'test') console.error(err.stack || err.toString()); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Try rendering a view. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| function tryRender(view, options, callback) { | ||||
|   try { | ||||
|     view.render(options, callback); | ||||
|   } catch (err) { | ||||
|     callback(err); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										116
									
								
								node_modules/express/lib/express.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								node_modules/express/lib/express.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,116 @@ | |||
| /*! | ||||
|  * express | ||||
|  * Copyright(c) 2009-2013 TJ Holowaychuk | ||||
|  * Copyright(c) 2013 Roman Shtylman | ||||
|  * Copyright(c) 2014-2015 Douglas Christopher Wilson | ||||
|  * MIT Licensed | ||||
|  */ | ||||
| 
 | ||||
| 'use strict'; | ||||
| 
 | ||||
| /** | ||||
|  * Module dependencies. | ||||
|  */ | ||||
| 
 | ||||
| var bodyParser = require('body-parser') | ||||
| var EventEmitter = require('events').EventEmitter; | ||||
| var mixin = require('merge-descriptors'); | ||||
| var proto = require('./application'); | ||||
| var Route = require('./router/route'); | ||||
| var Router = require('./router'); | ||||
| var req = require('./request'); | ||||
| var res = require('./response'); | ||||
| 
 | ||||
| /** | ||||
|  * Expose `createApplication()`. | ||||
|  */ | ||||
| 
 | ||||
| exports = module.exports = createApplication; | ||||
| 
 | ||||
| /** | ||||
|  * Create an express application. | ||||
|  * | ||||
|  * @return {Function} | ||||
|  * @api public | ||||
|  */ | ||||
| 
 | ||||
| function createApplication() { | ||||
|   var app = function(req, res, next) { | ||||
|     app.handle(req, res, next); | ||||
|   }; | ||||
| 
 | ||||
|   mixin(app, EventEmitter.prototype, false); | ||||
|   mixin(app, proto, false); | ||||
| 
 | ||||
|   // expose the prototype that will get set on requests
 | ||||
|   app.request = Object.create(req, { | ||||
|     app: { configurable: true, enumerable: true, writable: true, value: app } | ||||
|   }) | ||||
| 
 | ||||
|   // expose the prototype that will get set on responses
 | ||||
|   app.response = Object.create(res, { | ||||
|     app: { configurable: true, enumerable: true, writable: true, value: app } | ||||
|   }) | ||||
| 
 | ||||
|   app.init(); | ||||
|   return app; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Expose the prototypes. | ||||
|  */ | ||||
| 
 | ||||
| exports.application = proto; | ||||
| exports.request = req; | ||||
| exports.response = res; | ||||
| 
 | ||||
| /** | ||||
|  * Expose constructors. | ||||
|  */ | ||||
| 
 | ||||
| exports.Route = Route; | ||||
| exports.Router = Router; | ||||
| 
 | ||||
| /** | ||||
|  * Expose middleware | ||||
|  */ | ||||
| 
 | ||||
| exports.json = bodyParser.json | ||||
| exports.query = require('./middleware/query'); | ||||
| exports.raw = bodyParser.raw | ||||
| exports.static = require('serve-static'); | ||||
| exports.text = bodyParser.text | ||||
| exports.urlencoded = bodyParser.urlencoded | ||||
| 
 | ||||
| /** | ||||
|  * Replace removed middleware with an appropriate error message. | ||||
|  */ | ||||
| 
 | ||||
| var removedMiddlewares = [ | ||||
|   'bodyParser', | ||||
|   'compress', | ||||
|   'cookieSession', | ||||
|   'session', | ||||
|   'logger', | ||||
|   'cookieParser', | ||||
|   'favicon', | ||||
|   'responseTime', | ||||
|   'errorHandler', | ||||
|   'timeout', | ||||
|   'methodOverride', | ||||
|   'vhost', | ||||
|   'csrf', | ||||
|   'directory', | ||||
|   'limit', | ||||
|   'multipart', | ||||
|   'staticCache' | ||||
| ] | ||||
| 
 | ||||
| removedMiddlewares.forEach(function (name) { | ||||
|   Object.defineProperty(exports, name, { | ||||
|     get: function () { | ||||
|       throw new Error('Most middleware (like ' + name + ') is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.'); | ||||
|     }, | ||||
|     configurable: true | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										43
									
								
								node_modules/express/lib/middleware/init.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								node_modules/express/lib/middleware/init.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,43 @@ | |||
| /*! | ||||
|  * express | ||||
|  * Copyright(c) 2009-2013 TJ Holowaychuk | ||||
|  * Copyright(c) 2013 Roman Shtylman | ||||
|  * Copyright(c) 2014-2015 Douglas Christopher Wilson | ||||
|  * MIT Licensed | ||||
|  */ | ||||
| 
 | ||||
| 'use strict'; | ||||
| 
 | ||||
| /** | ||||
|  * Module dependencies. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| var setPrototypeOf = require('setprototypeof') | ||||
| 
 | ||||
| /** | ||||
|  * Initialization middleware, exposing the | ||||
|  * request and response to each other, as well | ||||
|  * as defaulting the X-Powered-By header field. | ||||
|  * | ||||
|  * @param {Function} app | ||||
|  * @return {Function} | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| exports.init = function(app){ | ||||
|   return function expressInit(req, res, next){ | ||||
|     if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express'); | ||||
|     req.res = res; | ||||
|     res.req = req; | ||||
|     req.next = next; | ||||
| 
 | ||||
|     setPrototypeOf(req, app.request) | ||||
|     setPrototypeOf(res, app.response) | ||||
| 
 | ||||
|     res.locals = res.locals || Object.create(null); | ||||
| 
 | ||||
|     next(); | ||||
|   }; | ||||
| }; | ||||
| 
 | ||||
							
								
								
									
										47
									
								
								node_modules/express/lib/middleware/query.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								node_modules/express/lib/middleware/query.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | |||
| /*! | ||||
|  * express | ||||
|  * Copyright(c) 2009-2013 TJ Holowaychuk | ||||
|  * Copyright(c) 2013 Roman Shtylman | ||||
|  * Copyright(c) 2014-2015 Douglas Christopher Wilson | ||||
|  * MIT Licensed | ||||
|  */ | ||||
| 
 | ||||
| 'use strict'; | ||||
| 
 | ||||
| /** | ||||
|  * Module dependencies. | ||||
|  */ | ||||
| 
 | ||||
| var merge = require('utils-merge') | ||||
| var parseUrl = require('parseurl'); | ||||
| var qs = require('qs'); | ||||
| 
 | ||||
| /** | ||||
|  * @param {Object} options | ||||
|  * @return {Function} | ||||
|  * @api public | ||||
|  */ | ||||
| 
 | ||||
| module.exports = function query(options) { | ||||
|   var opts = merge({}, options) | ||||
|   var queryparse = qs.parse; | ||||
| 
 | ||||
|   if (typeof options === 'function') { | ||||
|     queryparse = options; | ||||
|     opts = undefined; | ||||
|   } | ||||
| 
 | ||||
|   if (opts !== undefined && opts.allowPrototypes === undefined) { | ||||
|     // back-compat for qs module
 | ||||
|     opts.allowPrototypes = true; | ||||
|   } | ||||
| 
 | ||||
|   return function query(req, res, next){ | ||||
|     if (!req.query) { | ||||
|       var val = parseUrl(req).query; | ||||
|       req.query = queryparse(val, opts); | ||||
|     } | ||||
| 
 | ||||
|     next(); | ||||
|   }; | ||||
| }; | ||||
							
								
								
									
										525
									
								
								node_modules/express/lib/request.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										525
									
								
								node_modules/express/lib/request.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,525 @@ | |||
| /*! | ||||
|  * express | ||||
|  * Copyright(c) 2009-2013 TJ Holowaychuk | ||||
|  * Copyright(c) 2013 Roman Shtylman | ||||
|  * Copyright(c) 2014-2015 Douglas Christopher Wilson | ||||
|  * MIT Licensed | ||||
|  */ | ||||
| 
 | ||||
| 'use strict'; | ||||
| 
 | ||||
| /** | ||||
|  * Module dependencies. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| var accepts = require('accepts'); | ||||
| var deprecate = require('depd')('express'); | ||||
| var isIP = require('net').isIP; | ||||
| var typeis = require('type-is'); | ||||
| var http = require('http'); | ||||
| var fresh = require('fresh'); | ||||
| var parseRange = require('range-parser'); | ||||
| var parse = require('parseurl'); | ||||
| var proxyaddr = require('proxy-addr'); | ||||
| 
 | ||||
| /** | ||||
|  * Request prototype. | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| var req = Object.create(http.IncomingMessage.prototype) | ||||
| 
 | ||||
| /** | ||||
|  * Module exports. | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| module.exports = req | ||||
| 
 | ||||
| /** | ||||
|  * Return request header. | ||||
|  * | ||||
|  * The `Referrer` header field is special-cased, | ||||
|  * both `Referrer` and `Referer` are interchangeable. | ||||
|  * | ||||
|  * Examples: | ||||
|  * | ||||
|  *     req.get('Content-Type'); | ||||
|  *     // => "text/plain"
 | ||||
|  * | ||||
|  *     req.get('content-type'); | ||||
|  *     // => "text/plain"
 | ||||
|  * | ||||
|  *     req.get('Something'); | ||||
|  *     // => undefined
 | ||||
|  * | ||||
|  * Aliased as `req.header()`. | ||||
|  * | ||||
|  * @param {String} name | ||||
|  * @return {String} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| req.get = | ||||
| req.header = function header(name) { | ||||
|   if (!name) { | ||||
|     throw new TypeError('name argument is required to req.get'); | ||||
|   } | ||||
| 
 | ||||
|   if (typeof name !== 'string') { | ||||
|     throw new TypeError('name must be a string to req.get'); | ||||
|   } | ||||
| 
 | ||||
|   var lc = name.toLowerCase(); | ||||
| 
 | ||||
|   switch (lc) { | ||||
|     case 'referer': | ||||
|     case 'referrer': | ||||
|       return this.headers.referrer | ||||
|         || this.headers.referer; | ||||
|     default: | ||||
|       return this.headers[lc]; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * To do: update docs. | ||||
|  * | ||||
|  * Check if the given `type(s)` is acceptable, returning | ||||
|  * the best match when true, otherwise `undefined`, in which | ||||
|  * case you should respond with 406 "Not Acceptable". | ||||
|  * | ||||
|  * The `type` value may be a single MIME type string | ||||
|  * such as "application/json", an extension name | ||||
|  * such as "json", a comma-delimited list such as "json, html, text/plain", | ||||
|  * an argument list such as `"json", "html", "text/plain"`, | ||||
|  * or an array `["json", "html", "text/plain"]`. When a list | ||||
|  * or array is given, the _best_ match, if any is returned. | ||||
|  * | ||||
|  * Examples: | ||||
|  * | ||||
|  *     // Accept: text/html
 | ||||
|  *     req.accepts('html'); | ||||
|  *     // => "html"
 | ||||
|  * | ||||
|  *     // Accept: text/*, application/json
 | ||||
|  *     req.accepts('html'); | ||||
|  *     // => "html"
 | ||||
|  *     req.accepts('text/html'); | ||||
|  *     // => "text/html"
 | ||||
|  *     req.accepts('json, text'); | ||||
|  *     // => "json"
 | ||||
|  *     req.accepts('application/json'); | ||||
|  *     // => "application/json"
 | ||||
|  * | ||||
|  *     // Accept: text/*, application/json
 | ||||
|  *     req.accepts('image/png'); | ||||
|  *     req.accepts('png'); | ||||
|  *     // => undefined
 | ||||
|  * | ||||
|  *     // Accept: text/*;q=.5, application/json
 | ||||
|  *     req.accepts(['html', 'json']); | ||||
|  *     req.accepts('html', 'json'); | ||||
|  *     req.accepts('html, json'); | ||||
|  *     // => "json"
 | ||||
|  * | ||||
|  * @param {String|Array} type(s) | ||||
|  * @return {String|Array|Boolean} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| req.accepts = function(){ | ||||
|   var accept = accepts(this); | ||||
|   return accept.types.apply(accept, arguments); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Check if the given `encoding`s are accepted. | ||||
|  * | ||||
|  * @param {String} ...encoding | ||||
|  * @return {String|Array} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| req.acceptsEncodings = function(){ | ||||
|   var accept = accepts(this); | ||||
|   return accept.encodings.apply(accept, arguments); | ||||
| }; | ||||
| 
 | ||||
| req.acceptsEncoding = deprecate.function(req.acceptsEncodings, | ||||
|   'req.acceptsEncoding: Use acceptsEncodings instead'); | ||||
| 
 | ||||
| /** | ||||
|  * Check if the given `charset`s are acceptable, | ||||
|  * otherwise you should respond with 406 "Not Acceptable". | ||||
|  * | ||||
|  * @param {String} ...charset | ||||
|  * @return {String|Array} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| req.acceptsCharsets = function(){ | ||||
|   var accept = accepts(this); | ||||
|   return accept.charsets.apply(accept, arguments); | ||||
| }; | ||||
| 
 | ||||
| req.acceptsCharset = deprecate.function(req.acceptsCharsets, | ||||
|   'req.acceptsCharset: Use acceptsCharsets instead'); | ||||
| 
 | ||||
| /** | ||||
|  * Check if the given `lang`s are acceptable, | ||||
|  * otherwise you should respond with 406 "Not Acceptable". | ||||
|  * | ||||
|  * @param {String} ...lang | ||||
|  * @return {String|Array} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| req.acceptsLanguages = function(){ | ||||
|   var accept = accepts(this); | ||||
|   return accept.languages.apply(accept, arguments); | ||||
| }; | ||||
| 
 | ||||
| req.acceptsLanguage = deprecate.function(req.acceptsLanguages, | ||||
|   'req.acceptsLanguage: Use acceptsLanguages instead'); | ||||
| 
 | ||||
| /** | ||||
|  * Parse Range header field, capping to the given `size`. | ||||
|  * | ||||
|  * Unspecified ranges such as "0-" require knowledge of your resource length. In | ||||
|  * the case of a byte range this is of course the total number of bytes. If the | ||||
|  * Range header field is not given `undefined` is returned, `-1` when unsatisfiable, | ||||
|  * and `-2` when syntactically invalid. | ||||
|  * | ||||
|  * When ranges are returned, the array has a "type" property which is the type of | ||||
|  * range that is required (most commonly, "bytes"). Each array element is an object | ||||
|  * with a "start" and "end" property for the portion of the range. | ||||
|  * | ||||
|  * The "combine" option can be set to `true` and overlapping & adjacent ranges | ||||
|  * will be combined into a single range. | ||||
|  * | ||||
|  * NOTE: remember that ranges are inclusive, so for example "Range: users=0-3" | ||||
|  * should respond with 4 users when available, not 3. | ||||
|  * | ||||
|  * @param {number} size | ||||
|  * @param {object} [options] | ||||
|  * @param {boolean} [options.combine=false] | ||||
|  * @return {number|array} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| req.range = function range(size, options) { | ||||
|   var range = this.get('Range'); | ||||
|   if (!range) return; | ||||
|   return parseRange(size, range, options); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Return the value of param `name` when present or `defaultValue`. | ||||
|  * | ||||
|  *  - Checks route placeholders, ex: _/user/:id_ | ||||
|  *  - Checks body params, ex: id=12, {"id":12} | ||||
|  *  - Checks query string params, ex: ?id=12 | ||||
|  * | ||||
|  * To utilize request bodies, `req.body` | ||||
|  * should be an object. This can be done by using | ||||
|  * the `bodyParser()` middleware. | ||||
|  * | ||||
|  * @param {String} name | ||||
|  * @param {Mixed} [defaultValue] | ||||
|  * @return {String} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| req.param = function param(name, defaultValue) { | ||||
|   var params = this.params || {}; | ||||
|   var body = this.body || {}; | ||||
|   var query = this.query || {}; | ||||
| 
 | ||||
|   var args = arguments.length === 1 | ||||
|     ? 'name' | ||||
|     : 'name, default'; | ||||
|   deprecate('req.param(' + args + '): Use req.params, req.body, or req.query instead'); | ||||
| 
 | ||||
|   if (null != params[name] && params.hasOwnProperty(name)) return params[name]; | ||||
|   if (null != body[name]) return body[name]; | ||||
|   if (null != query[name]) return query[name]; | ||||
| 
 | ||||
|   return defaultValue; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Check if the incoming request contains the "Content-Type" | ||||
|  * header field, and it contains the given mime `type`. | ||||
|  * | ||||
|  * Examples: | ||||
|  * | ||||
|  *      // With Content-Type: text/html; charset=utf-8
 | ||||
|  *      req.is('html'); | ||||
|  *      req.is('text/html'); | ||||
|  *      req.is('text/*'); | ||||
|  *      // => true
 | ||||
|  * | ||||
|  *      // When Content-Type is application/json
 | ||||
|  *      req.is('json'); | ||||
|  *      req.is('application/json'); | ||||
|  *      req.is('application/*'); | ||||
|  *      // => true
 | ||||
|  * | ||||
|  *      req.is('html'); | ||||
|  *      // => false
 | ||||
|  * | ||||
|  * @param {String|Array} types... | ||||
|  * @return {String|false|null} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| req.is = function is(types) { | ||||
|   var arr = types; | ||||
| 
 | ||||
|   // support flattened arguments
 | ||||
|   if (!Array.isArray(types)) { | ||||
|     arr = new Array(arguments.length); | ||||
|     for (var i = 0; i < arr.length; i++) { | ||||
|       arr[i] = arguments[i]; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return typeis(this, arr); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Return the protocol string "http" or "https" | ||||
|  * when requested with TLS. When the "trust proxy" | ||||
|  * setting trusts the socket address, the | ||||
|  * "X-Forwarded-Proto" header field will be trusted | ||||
|  * and used if present. | ||||
|  * | ||||
|  * If you're running behind a reverse proxy that | ||||
|  * supplies https for you this may be enabled. | ||||
|  * | ||||
|  * @return {String} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| defineGetter(req, 'protocol', function protocol(){ | ||||
|   var proto = this.connection.encrypted | ||||
|     ? 'https' | ||||
|     : 'http'; | ||||
|   var trust = this.app.get('trust proxy fn'); | ||||
| 
 | ||||
|   if (!trust(this.connection.remoteAddress, 0)) { | ||||
|     return proto; | ||||
|   } | ||||
| 
 | ||||
|   // Note: X-Forwarded-Proto is normally only ever a
 | ||||
|   //       single value, but this is to be safe.
 | ||||
|   var header = this.get('X-Forwarded-Proto') || proto | ||||
|   var index = header.indexOf(',') | ||||
| 
 | ||||
|   return index !== -1 | ||||
|     ? header.substring(0, index).trim() | ||||
|     : header.trim() | ||||
| }); | ||||
| 
 | ||||
| /** | ||||
|  * Short-hand for: | ||||
|  * | ||||
|  *    req.protocol === 'https' | ||||
|  * | ||||
|  * @return {Boolean} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| defineGetter(req, 'secure', function secure(){ | ||||
|   return this.protocol === 'https'; | ||||
| }); | ||||
| 
 | ||||
| /** | ||||
|  * Return the remote address from the trusted proxy. | ||||
|  * | ||||
|  * The is the remote address on the socket unless | ||||
|  * "trust proxy" is set. | ||||
|  * | ||||
|  * @return {String} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| defineGetter(req, 'ip', function ip(){ | ||||
|   var trust = this.app.get('trust proxy fn'); | ||||
|   return proxyaddr(this, trust); | ||||
| }); | ||||
| 
 | ||||
| /** | ||||
|  * When "trust proxy" is set, trusted proxy addresses + client. | ||||
|  * | ||||
|  * For example if the value were "client, proxy1, proxy2" | ||||
|  * you would receive the array `["client", "proxy1", "proxy2"]` | ||||
|  * where "proxy2" is the furthest down-stream and "proxy1" and | ||||
|  * "proxy2" were trusted. | ||||
|  * | ||||
|  * @return {Array} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| defineGetter(req, 'ips', function ips() { | ||||
|   var trust = this.app.get('trust proxy fn'); | ||||
|   var addrs = proxyaddr.all(this, trust); | ||||
| 
 | ||||
|   // reverse the order (to farthest -> closest)
 | ||||
|   // and remove socket address
 | ||||
|   addrs.reverse().pop() | ||||
| 
 | ||||
|   return addrs | ||||
| }); | ||||
| 
 | ||||
| /** | ||||
|  * Return subdomains as an array. | ||||
|  * | ||||
|  * Subdomains are the dot-separated parts of the host before the main domain of | ||||
|  * the app. By default, the domain of the app is assumed to be the last two | ||||
|  * parts of the host. This can be changed by setting "subdomain offset". | ||||
|  * | ||||
|  * For example, if the domain is "tobi.ferrets.example.com": | ||||
|  * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`. | ||||
|  * If "subdomain offset" is 3, req.subdomains is `["tobi"]`. | ||||
|  * | ||||
|  * @return {Array} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| defineGetter(req, 'subdomains', function subdomains() { | ||||
|   var hostname = this.hostname; | ||||
| 
 | ||||
|   if (!hostname) return []; | ||||
| 
 | ||||
|   var offset = this.app.get('subdomain offset'); | ||||
|   var subdomains = !isIP(hostname) | ||||
|     ? hostname.split('.').reverse() | ||||
|     : [hostname]; | ||||
| 
 | ||||
|   return subdomains.slice(offset); | ||||
| }); | ||||
| 
 | ||||
| /** | ||||
|  * Short-hand for `url.parse(req.url).pathname`. | ||||
|  * | ||||
|  * @return {String} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| defineGetter(req, 'path', function path() { | ||||
|   return parse(this).pathname; | ||||
| }); | ||||
| 
 | ||||
| /** | ||||
|  * Parse the "Host" header field to a hostname. | ||||
|  * | ||||
|  * When the "trust proxy" setting trusts the socket | ||||
|  * address, the "X-Forwarded-Host" header field will | ||||
|  * be trusted. | ||||
|  * | ||||
|  * @return {String} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| defineGetter(req, 'hostname', function hostname(){ | ||||
|   var trust = this.app.get('trust proxy fn'); | ||||
|   var host = this.get('X-Forwarded-Host'); | ||||
| 
 | ||||
|   if (!host || !trust(this.connection.remoteAddress, 0)) { | ||||
|     host = this.get('Host'); | ||||
|   } else if (host.indexOf(',') !== -1) { | ||||
|     // Note: X-Forwarded-Host is normally only ever a
 | ||||
|     //       single value, but this is to be safe.
 | ||||
|     host = host.substring(0, host.indexOf(',')).trimRight() | ||||
|   } | ||||
| 
 | ||||
|   if (!host) return; | ||||
| 
 | ||||
|   // IPv6 literal support
 | ||||
|   var offset = host[0] === '[' | ||||
|     ? host.indexOf(']') + 1 | ||||
|     : 0; | ||||
|   var index = host.indexOf(':', offset); | ||||
| 
 | ||||
|   return index !== -1 | ||||
|     ? host.substring(0, index) | ||||
|     : host; | ||||
| }); | ||||
| 
 | ||||
| // TODO: change req.host to return host in next major
 | ||||
| 
 | ||||
| defineGetter(req, 'host', deprecate.function(function host(){ | ||||
|   return this.hostname; | ||||
| }, 'req.host: Use req.hostname instead')); | ||||
| 
 | ||||
| /** | ||||
|  * Check if the request is fresh, aka | ||||
|  * Last-Modified and/or the ETag | ||||
|  * still match. | ||||
|  * | ||||
|  * @return {Boolean} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| defineGetter(req, 'fresh', function(){ | ||||
|   var method = this.method; | ||||
|   var res = this.res | ||||
|   var status = res.statusCode | ||||
| 
 | ||||
|   // GET or HEAD for weak freshness validation only
 | ||||
|   if ('GET' !== method && 'HEAD' !== method) return false; | ||||
| 
 | ||||
|   // 2xx or 304 as per rfc2616 14.26
 | ||||
|   if ((status >= 200 && status < 300) || 304 === status) { | ||||
|     return fresh(this.headers, { | ||||
|       'etag': res.get('ETag'), | ||||
|       'last-modified': res.get('Last-Modified') | ||||
|     }) | ||||
|   } | ||||
| 
 | ||||
|   return false; | ||||
| }); | ||||
| 
 | ||||
| /** | ||||
|  * Check if the request is stale, aka | ||||
|  * "Last-Modified" and / or the "ETag" for the | ||||
|  * resource has changed. | ||||
|  * | ||||
|  * @return {Boolean} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| defineGetter(req, 'stale', function stale(){ | ||||
|   return !this.fresh; | ||||
| }); | ||||
| 
 | ||||
| /** | ||||
|  * Check if the request was an _XMLHttpRequest_. | ||||
|  * | ||||
|  * @return {Boolean} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| defineGetter(req, 'xhr', function xhr(){ | ||||
|   var val = this.get('X-Requested-With') || ''; | ||||
|   return val.toLowerCase() === 'xmlhttprequest'; | ||||
| }); | ||||
| 
 | ||||
| /** | ||||
|  * Helper function for creating a getter on an object. | ||||
|  * | ||||
|  * @param {Object} obj | ||||
|  * @param {String} name | ||||
|  * @param {Function} getter | ||||
|  * @private | ||||
|  */ | ||||
| function defineGetter(obj, name, getter) { | ||||
|   Object.defineProperty(obj, name, { | ||||
|     configurable: true, | ||||
|     enumerable: true, | ||||
|     get: getter | ||||
|   }); | ||||
| } | ||||
							
								
								
									
										1169
									
								
								node_modules/express/lib/response.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1169
									
								
								node_modules/express/lib/response.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										673
									
								
								node_modules/express/lib/router/index.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										673
									
								
								node_modules/express/lib/router/index.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,673 @@ | |||
| /*! | ||||
|  * express | ||||
|  * Copyright(c) 2009-2013 TJ Holowaychuk | ||||
|  * Copyright(c) 2013 Roman Shtylman | ||||
|  * Copyright(c) 2014-2015 Douglas Christopher Wilson | ||||
|  * MIT Licensed | ||||
|  */ | ||||
| 
 | ||||
| 'use strict'; | ||||
| 
 | ||||
| /** | ||||
|  * Module dependencies. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| var Route = require('./route'); | ||||
| var Layer = require('./layer'); | ||||
| var methods = require('methods'); | ||||
| var mixin = require('utils-merge'); | ||||
| var debug = require('debug')('express:router'); | ||||
| var deprecate = require('depd')('express'); | ||||
| var flatten = require('array-flatten'); | ||||
| var parseUrl = require('parseurl'); | ||||
| var setPrototypeOf = require('setprototypeof') | ||||
| 
 | ||||
| /** | ||||
|  * Module variables. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| var objectRegExp = /^\[object (\S+)\]$/; | ||||
| var slice = Array.prototype.slice; | ||||
| var toString = Object.prototype.toString; | ||||
| 
 | ||||
| /** | ||||
|  * Initialize a new `Router` with the given `options`. | ||||
|  * | ||||
|  * @param {Object} [options] | ||||
|  * @return {Router} which is an callable function | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| var proto = module.exports = function(options) { | ||||
|   var opts = options || {}; | ||||
| 
 | ||||
|   function router(req, res, next) { | ||||
|     router.handle(req, res, next); | ||||
|   } | ||||
| 
 | ||||
|   // mixin Router class functions
 | ||||
|   setPrototypeOf(router, proto) | ||||
| 
 | ||||
|   router.params = {}; | ||||
|   router._params = []; | ||||
|   router.caseSensitive = opts.caseSensitive; | ||||
|   router.mergeParams = opts.mergeParams; | ||||
|   router.strict = opts.strict; | ||||
|   router.stack = []; | ||||
| 
 | ||||
|   return router; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Map the given param placeholder `name`(s) to the given callback. | ||||
|  * | ||||
|  * Parameter mapping is used to provide pre-conditions to routes | ||||
|  * which use normalized placeholders. For example a _:user_id_ parameter | ||||
|  * could automatically load a user's information from the database without | ||||
|  * any additional code, | ||||
|  * | ||||
|  * The callback uses the same signature as middleware, the only difference | ||||
|  * being that the value of the placeholder is passed, in this case the _id_ | ||||
|  * of the user. Once the `next()` function is invoked, just like middleware | ||||
|  * it will continue on to execute the route, or subsequent parameter functions. | ||||
|  * | ||||
|  * Just like in middleware, you must either respond to the request or call next | ||||
|  * to avoid stalling the request. | ||||
|  * | ||||
|  *  app.param('user_id', function(req, res, next, id){ | ||||
|  *    User.find(id, function(err, user){ | ||||
|  *      if (err) { | ||||
|  *        return next(err); | ||||
|  *      } else if (!user) { | ||||
|  *        return next(new Error('failed to load user')); | ||||
|  *      } | ||||
|  *      req.user = user; | ||||
|  *      next(); | ||||
|  *    }); | ||||
|  *  }); | ||||
|  * | ||||
|  * @param {String} name | ||||
|  * @param {Function} fn | ||||
|  * @return {app} for chaining | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| proto.param = function param(name, fn) { | ||||
|   // param logic
 | ||||
|   if (typeof name === 'function') { | ||||
|     deprecate('router.param(fn): Refactor to use path params'); | ||||
|     this._params.push(name); | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   // apply param functions
 | ||||
|   var params = this._params; | ||||
|   var len = params.length; | ||||
|   var ret; | ||||
| 
 | ||||
|   if (name[0] === ':') { | ||||
|     deprecate('router.param(' + JSON.stringify(name) + ', fn): Use router.param(' + JSON.stringify(name.slice(1)) + ', fn) instead') | ||||
|     name = name.slice(1) | ||||
|   } | ||||
| 
 | ||||
|   for (var i = 0; i < len; ++i) { | ||||
|     if (ret = params[i](name, fn)) { | ||||
|       fn = ret; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // ensure we end up with a
 | ||||
|   // middleware function
 | ||||
|   if ('function' !== typeof fn) { | ||||
|     throw new Error('invalid param() call for ' + name + ', got ' + fn); | ||||
|   } | ||||
| 
 | ||||
|   (this.params[name] = this.params[name] || []).push(fn); | ||||
|   return this; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Dispatch a req, res into the router. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| proto.handle = function handle(req, res, out) { | ||||
|   var self = this; | ||||
| 
 | ||||
|   debug('dispatching %s %s', req.method, req.url); | ||||
| 
 | ||||
|   var idx = 0; | ||||
|   var protohost = getProtohost(req.url) || '' | ||||
|   var removed = ''; | ||||
|   var slashAdded = false; | ||||
|   var sync = 0 | ||||
|   var paramcalled = {}; | ||||
| 
 | ||||
|   // store options for OPTIONS request
 | ||||
|   // only used if OPTIONS request
 | ||||
|   var options = []; | ||||
| 
 | ||||
|   // middleware and routes
 | ||||
|   var stack = self.stack; | ||||
| 
 | ||||
|   // manage inter-router variables
 | ||||
|   var parentParams = req.params; | ||||
|   var parentUrl = req.baseUrl || ''; | ||||
|   var done = restore(out, req, 'baseUrl', 'next', 'params'); | ||||
| 
 | ||||
|   // setup next layer
 | ||||
|   req.next = next; | ||||
| 
 | ||||
|   // for options requests, respond with a default if nothing else responds
 | ||||
|   if (req.method === 'OPTIONS') { | ||||
|     done = wrap(done, function(old, err) { | ||||
|       if (err || options.length === 0) return old(err); | ||||
|       sendOptionsResponse(res, options, old); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   // setup basic req values
 | ||||
|   req.baseUrl = parentUrl; | ||||
|   req.originalUrl = req.originalUrl || req.url; | ||||
| 
 | ||||
|   next(); | ||||
| 
 | ||||
|   function next(err) { | ||||
|     var layerError = err === 'route' | ||||
|       ? null | ||||
|       : err; | ||||
| 
 | ||||
|     // remove added slash
 | ||||
|     if (slashAdded) { | ||||
|       req.url = req.url.slice(1) | ||||
|       slashAdded = false; | ||||
|     } | ||||
| 
 | ||||
|     // restore altered req.url
 | ||||
|     if (removed.length !== 0) { | ||||
|       req.baseUrl = parentUrl; | ||||
|       req.url = protohost + removed + req.url.slice(protohost.length) | ||||
|       removed = ''; | ||||
|     } | ||||
| 
 | ||||
|     // signal to exit router
 | ||||
|     if (layerError === 'router') { | ||||
|       setImmediate(done, null) | ||||
|       return | ||||
|     } | ||||
| 
 | ||||
|     // no more matching layers
 | ||||
|     if (idx >= stack.length) { | ||||
|       setImmediate(done, layerError); | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     // max sync stack
 | ||||
|     if (++sync > 100) { | ||||
|       return setImmediate(next, err) | ||||
|     } | ||||
| 
 | ||||
|     // get pathname of request
 | ||||
|     var path = getPathname(req); | ||||
| 
 | ||||
|     if (path == null) { | ||||
|       return done(layerError); | ||||
|     } | ||||
| 
 | ||||
|     // find next matching layer
 | ||||
|     var layer; | ||||
|     var match; | ||||
|     var route; | ||||
| 
 | ||||
|     while (match !== true && idx < stack.length) { | ||||
|       layer = stack[idx++]; | ||||
|       match = matchLayer(layer, path); | ||||
|       route = layer.route; | ||||
| 
 | ||||
|       if (typeof match !== 'boolean') { | ||||
|         // hold on to layerError
 | ||||
|         layerError = layerError || match; | ||||
|       } | ||||
| 
 | ||||
|       if (match !== true) { | ||||
|         continue; | ||||
|       } | ||||
| 
 | ||||
|       if (!route) { | ||||
|         // process non-route handlers normally
 | ||||
|         continue; | ||||
|       } | ||||
| 
 | ||||
|       if (layerError) { | ||||
|         // routes do not match with a pending error
 | ||||
|         match = false; | ||||
|         continue; | ||||
|       } | ||||
| 
 | ||||
|       var method = req.method; | ||||
|       var has_method = route._handles_method(method); | ||||
| 
 | ||||
|       // build up automatic options response
 | ||||
|       if (!has_method && method === 'OPTIONS') { | ||||
|         appendMethods(options, route._options()); | ||||
|       } | ||||
| 
 | ||||
|       // don't even bother matching route
 | ||||
|       if (!has_method && method !== 'HEAD') { | ||||
|         match = false; | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     // no match
 | ||||
|     if (match !== true) { | ||||
|       return done(layerError); | ||||
|     } | ||||
| 
 | ||||
|     // store route for dispatch on change
 | ||||
|     if (route) { | ||||
|       req.route = route; | ||||
|     } | ||||
| 
 | ||||
|     // Capture one-time layer values
 | ||||
|     req.params = self.mergeParams | ||||
|       ? mergeParams(layer.params, parentParams) | ||||
|       : layer.params; | ||||
|     var layerPath = layer.path; | ||||
| 
 | ||||
|     // this should be done for the layer
 | ||||
|     self.process_params(layer, paramcalled, req, res, function (err) { | ||||
|       if (err) { | ||||
|         next(layerError || err) | ||||
|       } else if (route) { | ||||
|         layer.handle_request(req, res, next) | ||||
|       } else { | ||||
|         trim_prefix(layer, layerError, layerPath, path) | ||||
|       } | ||||
| 
 | ||||
|       sync = 0 | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   function trim_prefix(layer, layerError, layerPath, path) { | ||||
|     if (layerPath.length !== 0) { | ||||
|       // Validate path is a prefix match
 | ||||
|       if (layerPath !== path.slice(0, layerPath.length)) { | ||||
|         next(layerError) | ||||
|         return | ||||
|       } | ||||
| 
 | ||||
|       // Validate path breaks on a path separator
 | ||||
|       var c = path[layerPath.length] | ||||
|       if (c && c !== '/' && c !== '.') return next(layerError) | ||||
| 
 | ||||
|       // Trim off the part of the url that matches the route
 | ||||
|       // middleware (.use stuff) needs to have the path stripped
 | ||||
|       debug('trim prefix (%s) from url %s', layerPath, req.url); | ||||
|       removed = layerPath; | ||||
|       req.url = protohost + req.url.slice(protohost.length + removed.length) | ||||
| 
 | ||||
|       // Ensure leading slash
 | ||||
|       if (!protohost && req.url[0] !== '/') { | ||||
|         req.url = '/' + req.url; | ||||
|         slashAdded = true; | ||||
|       } | ||||
| 
 | ||||
|       // Setup base URL (no trailing slash)
 | ||||
|       req.baseUrl = parentUrl + (removed[removed.length - 1] === '/' | ||||
|         ? removed.substring(0, removed.length - 1) | ||||
|         : removed); | ||||
|     } | ||||
| 
 | ||||
|     debug('%s %s : %s', layer.name, layerPath, req.originalUrl); | ||||
| 
 | ||||
|     if (layerError) { | ||||
|       layer.handle_error(layerError, req, res, next); | ||||
|     } else { | ||||
|       layer.handle_request(req, res, next); | ||||
|     } | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Process any parameters for the layer. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| proto.process_params = function process_params(layer, called, req, res, done) { | ||||
|   var params = this.params; | ||||
| 
 | ||||
|   // captured parameters from the layer, keys and values
 | ||||
|   var keys = layer.keys; | ||||
| 
 | ||||
|   // fast track
 | ||||
|   if (!keys || keys.length === 0) { | ||||
|     return done(); | ||||
|   } | ||||
| 
 | ||||
|   var i = 0; | ||||
|   var name; | ||||
|   var paramIndex = 0; | ||||
|   var key; | ||||
|   var paramVal; | ||||
|   var paramCallbacks; | ||||
|   var paramCalled; | ||||
| 
 | ||||
|   // process params in order
 | ||||
|   // param callbacks can be async
 | ||||
|   function param(err) { | ||||
|     if (err) { | ||||
|       return done(err); | ||||
|     } | ||||
| 
 | ||||
|     if (i >= keys.length ) { | ||||
|       return done(); | ||||
|     } | ||||
| 
 | ||||
|     paramIndex = 0; | ||||
|     key = keys[i++]; | ||||
|     name = key.name; | ||||
|     paramVal = req.params[name]; | ||||
|     paramCallbacks = params[name]; | ||||
|     paramCalled = called[name]; | ||||
| 
 | ||||
|     if (paramVal === undefined || !paramCallbacks) { | ||||
|       return param(); | ||||
|     } | ||||
| 
 | ||||
|     // param previously called with same value or error occurred
 | ||||
|     if (paramCalled && (paramCalled.match === paramVal | ||||
|       || (paramCalled.error && paramCalled.error !== 'route'))) { | ||||
|       // restore value
 | ||||
|       req.params[name] = paramCalled.value; | ||||
| 
 | ||||
|       // next param
 | ||||
|       return param(paramCalled.error); | ||||
|     } | ||||
| 
 | ||||
|     called[name] = paramCalled = { | ||||
|       error: null, | ||||
|       match: paramVal, | ||||
|       value: paramVal | ||||
|     }; | ||||
| 
 | ||||
|     paramCallback(); | ||||
|   } | ||||
| 
 | ||||
|   // single param callbacks
 | ||||
|   function paramCallback(err) { | ||||
|     var fn = paramCallbacks[paramIndex++]; | ||||
| 
 | ||||
|     // store updated value
 | ||||
|     paramCalled.value = req.params[key.name]; | ||||
| 
 | ||||
|     if (err) { | ||||
|       // store error
 | ||||
|       paramCalled.error = err; | ||||
|       param(err); | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     if (!fn) return param(); | ||||
| 
 | ||||
|     try { | ||||
|       fn(req, res, paramCallback, paramVal, key.name); | ||||
|     } catch (e) { | ||||
|       paramCallback(e); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   param(); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Use the given middleware function, with optional path, defaulting to "/". | ||||
|  * | ||||
|  * Use (like `.all`) will run for any http METHOD, but it will not add | ||||
|  * handlers for those methods so OPTIONS requests will not consider `.use` | ||||
|  * functions even if they could respond. | ||||
|  * | ||||
|  * The other difference is that _route_ path is stripped and not visible | ||||
|  * to the handler function. The main effect of this feature is that mounted | ||||
|  * handlers can operate without any code changes regardless of the "prefix" | ||||
|  * pathname. | ||||
|  * | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| proto.use = function use(fn) { | ||||
|   var offset = 0; | ||||
|   var path = '/'; | ||||
| 
 | ||||
|   // default path to '/'
 | ||||
|   // disambiguate router.use([fn])
 | ||||
|   if (typeof fn !== 'function') { | ||||
|     var arg = fn; | ||||
| 
 | ||||
|     while (Array.isArray(arg) && arg.length !== 0) { | ||||
|       arg = arg[0]; | ||||
|     } | ||||
| 
 | ||||
|     // first arg is the path
 | ||||
|     if (typeof arg !== 'function') { | ||||
|       offset = 1; | ||||
|       path = fn; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   var callbacks = flatten(slice.call(arguments, offset)); | ||||
| 
 | ||||
|   if (callbacks.length === 0) { | ||||
|     throw new TypeError('Router.use() requires a middleware function') | ||||
|   } | ||||
| 
 | ||||
|   for (var i = 0; i < callbacks.length; i++) { | ||||
|     var fn = callbacks[i]; | ||||
| 
 | ||||
|     if (typeof fn !== 'function') { | ||||
|       throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn)) | ||||
|     } | ||||
| 
 | ||||
|     // add the middleware
 | ||||
|     debug('use %o %s', path, fn.name || '<anonymous>') | ||||
| 
 | ||||
|     var layer = new Layer(path, { | ||||
|       sensitive: this.caseSensitive, | ||||
|       strict: false, | ||||
|       end: false | ||||
|     }, fn); | ||||
| 
 | ||||
|     layer.route = undefined; | ||||
| 
 | ||||
|     this.stack.push(layer); | ||||
|   } | ||||
| 
 | ||||
|   return this; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Create a new Route for the given path. | ||||
|  * | ||||
|  * Each route contains a separate middleware stack and VERB handlers. | ||||
|  * | ||||
|  * See the Route api documentation for details on adding handlers | ||||
|  * and middleware to routes. | ||||
|  * | ||||
|  * @param {String} path | ||||
|  * @return {Route} | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| proto.route = function route(path) { | ||||
|   var route = new Route(path); | ||||
| 
 | ||||
|   var layer = new Layer(path, { | ||||
|     sensitive: this.caseSensitive, | ||||
|     strict: this.strict, | ||||
|     end: true | ||||
|   }, route.dispatch.bind(route)); | ||||
| 
 | ||||
|   layer.route = route; | ||||
| 
 | ||||
|   this.stack.push(layer); | ||||
|   return route; | ||||
| }; | ||||
| 
 | ||||
| // create Router#VERB functions
 | ||||
| methods.concat('all').forEach(function(method){ | ||||
|   proto[method] = function(path){ | ||||
|     var route = this.route(path) | ||||
|     route[method].apply(route, slice.call(arguments, 1)); | ||||
|     return this; | ||||
|   }; | ||||
| }); | ||||
| 
 | ||||
| // append methods to a list of methods
 | ||||
| function appendMethods(list, addition) { | ||||
|   for (var i = 0; i < addition.length; i++) { | ||||
|     var method = addition[i]; | ||||
|     if (list.indexOf(method) === -1) { | ||||
|       list.push(method); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // get pathname of request
 | ||||
| function getPathname(req) { | ||||
|   try { | ||||
|     return parseUrl(req).pathname; | ||||
|   } catch (err) { | ||||
|     return undefined; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // Get get protocol + host for a URL
 | ||||
| function getProtohost(url) { | ||||
|   if (typeof url !== 'string' || url.length === 0 || url[0] === '/') { | ||||
|     return undefined | ||||
|   } | ||||
| 
 | ||||
|   var searchIndex = url.indexOf('?') | ||||
|   var pathLength = searchIndex !== -1 | ||||
|     ? searchIndex | ||||
|     : url.length | ||||
|   var fqdnIndex = url.slice(0, pathLength).indexOf('://') | ||||
| 
 | ||||
|   return fqdnIndex !== -1 | ||||
|     ? url.substring(0, url.indexOf('/', 3 + fqdnIndex)) | ||||
|     : undefined | ||||
| } | ||||
| 
 | ||||
| // get type for error message
 | ||||
| function gettype(obj) { | ||||
|   var type = typeof obj; | ||||
| 
 | ||||
|   if (type !== 'object') { | ||||
|     return type; | ||||
|   } | ||||
| 
 | ||||
|   // inspect [[Class]] for objects
 | ||||
|   return toString.call(obj) | ||||
|     .replace(objectRegExp, '$1'); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Match path to a layer. | ||||
|  * | ||||
|  * @param {Layer} layer | ||||
|  * @param {string} path | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| function matchLayer(layer, path) { | ||||
|   try { | ||||
|     return layer.match(path); | ||||
|   } catch (err) { | ||||
|     return err; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // merge params with parent params
 | ||||
| function mergeParams(params, parent) { | ||||
|   if (typeof parent !== 'object' || !parent) { | ||||
|     return params; | ||||
|   } | ||||
| 
 | ||||
|   // make copy of parent for base
 | ||||
|   var obj = mixin({}, parent); | ||||
| 
 | ||||
|   // simple non-numeric merging
 | ||||
|   if (!(0 in params) || !(0 in parent)) { | ||||
|     return mixin(obj, params); | ||||
|   } | ||||
| 
 | ||||
|   var i = 0; | ||||
|   var o = 0; | ||||
| 
 | ||||
|   // determine numeric gaps
 | ||||
|   while (i in params) { | ||||
|     i++; | ||||
|   } | ||||
| 
 | ||||
|   while (o in parent) { | ||||
|     o++; | ||||
|   } | ||||
| 
 | ||||
|   // offset numeric indices in params before merge
 | ||||
|   for (i--; i >= 0; i--) { | ||||
|     params[i + o] = params[i]; | ||||
| 
 | ||||
|     // create holes for the merge when necessary
 | ||||
|     if (i < o) { | ||||
|       delete params[i]; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return mixin(obj, params); | ||||
| } | ||||
| 
 | ||||
| // restore obj props after function
 | ||||
| function restore(fn, obj) { | ||||
|   var props = new Array(arguments.length - 2); | ||||
|   var vals = new Array(arguments.length - 2); | ||||
| 
 | ||||
|   for (var i = 0; i < props.length; i++) { | ||||
|     props[i] = arguments[i + 2]; | ||||
|     vals[i] = obj[props[i]]; | ||||
|   } | ||||
| 
 | ||||
|   return function () { | ||||
|     // restore vals
 | ||||
|     for (var i = 0; i < props.length; i++) { | ||||
|       obj[props[i]] = vals[i]; | ||||
|     } | ||||
| 
 | ||||
|     return fn.apply(this, arguments); | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
| // send an OPTIONS response
 | ||||
| function sendOptionsResponse(res, options, next) { | ||||
|   try { | ||||
|     var body = options.join(','); | ||||
|     res.set('Allow', body); | ||||
|     res.send(body); | ||||
|   } catch (err) { | ||||
|     next(err); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // wrap a function
 | ||||
| function wrap(old, fn) { | ||||
|   return function proxy() { | ||||
|     var args = new Array(arguments.length + 1); | ||||
| 
 | ||||
|     args[0] = old; | ||||
|     for (var i = 0, len = arguments.length; i < len; i++) { | ||||
|       args[i + 1] = arguments[i]; | ||||
|     } | ||||
| 
 | ||||
|     fn.apply(this, args); | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										181
									
								
								node_modules/express/lib/router/layer.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										181
									
								
								node_modules/express/lib/router/layer.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,181 @@ | |||
| /*! | ||||
|  * express | ||||
|  * Copyright(c) 2009-2013 TJ Holowaychuk | ||||
|  * Copyright(c) 2013 Roman Shtylman | ||||
|  * Copyright(c) 2014-2015 Douglas Christopher Wilson | ||||
|  * MIT Licensed | ||||
|  */ | ||||
| 
 | ||||
| 'use strict'; | ||||
| 
 | ||||
| /** | ||||
|  * Module dependencies. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| var pathRegexp = require('path-to-regexp'); | ||||
| var debug = require('debug')('express:router:layer'); | ||||
| 
 | ||||
| /** | ||||
|  * Module variables. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| var hasOwnProperty = Object.prototype.hasOwnProperty; | ||||
| 
 | ||||
| /** | ||||
|  * Module exports. | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| module.exports = Layer; | ||||
| 
 | ||||
| function Layer(path, options, fn) { | ||||
|   if (!(this instanceof Layer)) { | ||||
|     return new Layer(path, options, fn); | ||||
|   } | ||||
| 
 | ||||
|   debug('new %o', path) | ||||
|   var opts = options || {}; | ||||
| 
 | ||||
|   this.handle = fn; | ||||
|   this.name = fn.name || '<anonymous>'; | ||||
|   this.params = undefined; | ||||
|   this.path = undefined; | ||||
|   this.regexp = pathRegexp(path, this.keys = [], opts); | ||||
| 
 | ||||
|   // set fast path flags
 | ||||
|   this.regexp.fast_star = path === '*' | ||||
|   this.regexp.fast_slash = path === '/' && opts.end === false | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Handle the error for the layer. | ||||
|  * | ||||
|  * @param {Error} error | ||||
|  * @param {Request} req | ||||
|  * @param {Response} res | ||||
|  * @param {function} next | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| Layer.prototype.handle_error = function handle_error(error, req, res, next) { | ||||
|   var fn = this.handle; | ||||
| 
 | ||||
|   if (fn.length !== 4) { | ||||
|     // not a standard error handler
 | ||||
|     return next(error); | ||||
|   } | ||||
| 
 | ||||
|   try { | ||||
|     fn(error, req, res, next); | ||||
|   } catch (err) { | ||||
|     next(err); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Handle the request for the layer. | ||||
|  * | ||||
|  * @param {Request} req | ||||
|  * @param {Response} res | ||||
|  * @param {function} next | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| Layer.prototype.handle_request = function handle(req, res, next) { | ||||
|   var fn = this.handle; | ||||
| 
 | ||||
|   if (fn.length > 3) { | ||||
|     // not a standard request handler
 | ||||
|     return next(); | ||||
|   } | ||||
| 
 | ||||
|   try { | ||||
|     fn(req, res, next); | ||||
|   } catch (err) { | ||||
|     next(err); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Check if this route matches `path`, if so | ||||
|  * populate `.params`. | ||||
|  * | ||||
|  * @param {String} path | ||||
|  * @return {Boolean} | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| Layer.prototype.match = function match(path) { | ||||
|   var match | ||||
| 
 | ||||
|   if (path != null) { | ||||
|     // fast path non-ending match for / (any path matches)
 | ||||
|     if (this.regexp.fast_slash) { | ||||
|       this.params = {} | ||||
|       this.path = '' | ||||
|       return true | ||||
|     } | ||||
| 
 | ||||
|     // fast path for * (everything matched in a param)
 | ||||
|     if (this.regexp.fast_star) { | ||||
|       this.params = {'0': decode_param(path)} | ||||
|       this.path = path | ||||
|       return true | ||||
|     } | ||||
| 
 | ||||
|     // match the path
 | ||||
|     match = this.regexp.exec(path) | ||||
|   } | ||||
| 
 | ||||
|   if (!match) { | ||||
|     this.params = undefined; | ||||
|     this.path = undefined; | ||||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|   // store values
 | ||||
|   this.params = {}; | ||||
|   this.path = match[0] | ||||
| 
 | ||||
|   var keys = this.keys; | ||||
|   var params = this.params; | ||||
| 
 | ||||
|   for (var i = 1; i < match.length; i++) { | ||||
|     var key = keys[i - 1]; | ||||
|     var prop = key.name; | ||||
|     var val = decode_param(match[i]) | ||||
| 
 | ||||
|     if (val !== undefined || !(hasOwnProperty.call(params, prop))) { | ||||
|       params[prop] = val; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return true; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Decode param value. | ||||
|  * | ||||
|  * @param {string} val | ||||
|  * @return {string} | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| function decode_param(val) { | ||||
|   if (typeof val !== 'string' || val.length === 0) { | ||||
|     return val; | ||||
|   } | ||||
| 
 | ||||
|   try { | ||||
|     return decodeURIComponent(val); | ||||
|   } catch (err) { | ||||
|     if (err instanceof URIError) { | ||||
|       err.message = 'Failed to decode param \'' + val + '\''; | ||||
|       err.status = err.statusCode = 400; | ||||
|     } | ||||
| 
 | ||||
|     throw err; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										225
									
								
								node_modules/express/lib/router/route.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										225
									
								
								node_modules/express/lib/router/route.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,225 @@ | |||
| /*! | ||||
|  * express | ||||
|  * Copyright(c) 2009-2013 TJ Holowaychuk | ||||
|  * Copyright(c) 2013 Roman Shtylman | ||||
|  * Copyright(c) 2014-2015 Douglas Christopher Wilson | ||||
|  * MIT Licensed | ||||
|  */ | ||||
| 
 | ||||
| 'use strict'; | ||||
| 
 | ||||
| /** | ||||
|  * Module dependencies. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| var debug = require('debug')('express:router:route'); | ||||
| var flatten = require('array-flatten'); | ||||
| var Layer = require('./layer'); | ||||
| var methods = require('methods'); | ||||
| 
 | ||||
| /** | ||||
|  * Module variables. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| var slice = Array.prototype.slice; | ||||
| var toString = Object.prototype.toString; | ||||
| 
 | ||||
| /** | ||||
|  * Module exports. | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| module.exports = Route; | ||||
| 
 | ||||
| /** | ||||
|  * Initialize `Route` with the given `path`, | ||||
|  * | ||||
|  * @param {String} path | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| function Route(path) { | ||||
|   this.path = path; | ||||
|   this.stack = []; | ||||
| 
 | ||||
|   debug('new %o', path) | ||||
| 
 | ||||
|   // route handlers for various http methods
 | ||||
|   this.methods = {}; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Determine if the route handles a given method. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| Route.prototype._handles_method = function _handles_method(method) { | ||||
|   if (this.methods._all) { | ||||
|     return true; | ||||
|   } | ||||
| 
 | ||||
|   var name = method.toLowerCase(); | ||||
| 
 | ||||
|   if (name === 'head' && !this.methods['head']) { | ||||
|     name = 'get'; | ||||
|   } | ||||
| 
 | ||||
|   return Boolean(this.methods[name]); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * @return {Array} supported HTTP methods | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| Route.prototype._options = function _options() { | ||||
|   var methods = Object.keys(this.methods); | ||||
| 
 | ||||
|   // append automatic head
 | ||||
|   if (this.methods.get && !this.methods.head) { | ||||
|     methods.push('head'); | ||||
|   } | ||||
| 
 | ||||
|   for (var i = 0; i < methods.length; i++) { | ||||
|     // make upper case
 | ||||
|     methods[i] = methods[i].toUpperCase(); | ||||
|   } | ||||
| 
 | ||||
|   return methods; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * dispatch req, res into this route | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| Route.prototype.dispatch = function dispatch(req, res, done) { | ||||
|   var idx = 0; | ||||
|   var stack = this.stack; | ||||
|   var sync = 0 | ||||
| 
 | ||||
|   if (stack.length === 0) { | ||||
|     return done(); | ||||
|   } | ||||
| 
 | ||||
|   var method = req.method.toLowerCase(); | ||||
|   if (method === 'head' && !this.methods['head']) { | ||||
|     method = 'get'; | ||||
|   } | ||||
| 
 | ||||
|   req.route = this; | ||||
| 
 | ||||
|   next(); | ||||
| 
 | ||||
|   function next(err) { | ||||
|     // signal to exit route
 | ||||
|     if (err && err === 'route') { | ||||
|       return done(); | ||||
|     } | ||||
| 
 | ||||
|     // signal to exit router
 | ||||
|     if (err && err === 'router') { | ||||
|       return done(err) | ||||
|     } | ||||
| 
 | ||||
|     // max sync stack
 | ||||
|     if (++sync > 100) { | ||||
|       return setImmediate(next, err) | ||||
|     } | ||||
| 
 | ||||
|     var layer = stack[idx++] | ||||
| 
 | ||||
|     // end of layers
 | ||||
|     if (!layer) { | ||||
|       return done(err) | ||||
|     } | ||||
| 
 | ||||
|     if (layer.method && layer.method !== method) { | ||||
|       next(err) | ||||
|     } else if (err) { | ||||
|       layer.handle_error(err, req, res, next); | ||||
|     } else { | ||||
|       layer.handle_request(req, res, next); | ||||
|     } | ||||
| 
 | ||||
|     sync = 0 | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Add a handler for all HTTP verbs to this route. | ||||
|  * | ||||
|  * Behaves just like middleware and can respond or call `next` | ||||
|  * to continue processing. | ||||
|  * | ||||
|  * You can use multiple `.all` call to add multiple handlers. | ||||
|  * | ||||
|  *   function check_something(req, res, next){ | ||||
|  *     next(); | ||||
|  *   }; | ||||
|  * | ||||
|  *   function validate_user(req, res, next){ | ||||
|  *     next(); | ||||
|  *   }; | ||||
|  * | ||||
|  *   route | ||||
|  *   .all(validate_user) | ||||
|  *   .all(check_something) | ||||
|  *   .get(function(req, res, next){ | ||||
|  *     res.send('hello world'); | ||||
|  *   }); | ||||
|  * | ||||
|  * @param {function} handler | ||||
|  * @return {Route} for chaining | ||||
|  * @api public | ||||
|  */ | ||||
| 
 | ||||
| Route.prototype.all = function all() { | ||||
|   var handles = flatten(slice.call(arguments)); | ||||
| 
 | ||||
|   for (var i = 0; i < handles.length; i++) { | ||||
|     var handle = handles[i]; | ||||
| 
 | ||||
|     if (typeof handle !== 'function') { | ||||
|       var type = toString.call(handle); | ||||
|       var msg = 'Route.all() requires a callback function but got a ' + type | ||||
|       throw new TypeError(msg); | ||||
|     } | ||||
| 
 | ||||
|     var layer = Layer('/', {}, handle); | ||||
|     layer.method = undefined; | ||||
| 
 | ||||
|     this.methods._all = true; | ||||
|     this.stack.push(layer); | ||||
|   } | ||||
| 
 | ||||
|   return this; | ||||
| }; | ||||
| 
 | ||||
| methods.forEach(function(method){ | ||||
|   Route.prototype[method] = function(){ | ||||
|     var handles = flatten(slice.call(arguments)); | ||||
| 
 | ||||
|     for (var i = 0; i < handles.length; i++) { | ||||
|       var handle = handles[i]; | ||||
| 
 | ||||
|       if (typeof handle !== 'function') { | ||||
|         var type = toString.call(handle); | ||||
|         var msg = 'Route.' + method + '() requires a callback function but got a ' + type | ||||
|         throw new Error(msg); | ||||
|       } | ||||
| 
 | ||||
|       debug('%s %o', method, this.path) | ||||
| 
 | ||||
|       var layer = Layer('/', {}, handle); | ||||
|       layer.method = method; | ||||
| 
 | ||||
|       this.methods[method] = true; | ||||
|       this.stack.push(layer); | ||||
|     } | ||||
| 
 | ||||
|     return this; | ||||
|   }; | ||||
| }); | ||||
							
								
								
									
										304
									
								
								node_modules/express/lib/utils.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										304
									
								
								node_modules/express/lib/utils.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,304 @@ | |||
| /*! | ||||
|  * express | ||||
|  * Copyright(c) 2009-2013 TJ Holowaychuk | ||||
|  * Copyright(c) 2014-2015 Douglas Christopher Wilson | ||||
|  * MIT Licensed | ||||
|  */ | ||||
| 
 | ||||
| 'use strict'; | ||||
| 
 | ||||
| /** | ||||
|  * Module dependencies. | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| var Buffer = require('safe-buffer').Buffer | ||||
| var contentDisposition = require('content-disposition'); | ||||
| var contentType = require('content-type'); | ||||
| var deprecate = require('depd')('express'); | ||||
| var flatten = require('array-flatten'); | ||||
| var mime = require('send').mime; | ||||
| var etag = require('etag'); | ||||
| var proxyaddr = require('proxy-addr'); | ||||
| var qs = require('qs'); | ||||
| var querystring = require('querystring'); | ||||
| 
 | ||||
| /** | ||||
|  * Return strong ETag for `body`. | ||||
|  * | ||||
|  * @param {String|Buffer} body | ||||
|  * @param {String} [encoding] | ||||
|  * @return {String} | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| exports.etag = createETagGenerator({ weak: false }) | ||||
| 
 | ||||
| /** | ||||
|  * Return weak ETag for `body`. | ||||
|  * | ||||
|  * @param {String|Buffer} body | ||||
|  * @param {String} [encoding] | ||||
|  * @return {String} | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| exports.wetag = createETagGenerator({ weak: true }) | ||||
| 
 | ||||
| /** | ||||
|  * Check if `path` looks absolute. | ||||
|  * | ||||
|  * @param {String} path | ||||
|  * @return {Boolean} | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| exports.isAbsolute = function(path){ | ||||
|   if ('/' === path[0]) return true; | ||||
|   if (':' === path[1] && ('\\' === path[2] || '/' === path[2])) return true; // Windows device path
 | ||||
|   if ('\\\\' === path.substring(0, 2)) return true; // Microsoft Azure absolute path
 | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Flatten the given `arr`. | ||||
|  * | ||||
|  * @param {Array} arr | ||||
|  * @return {Array} | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| exports.flatten = deprecate.function(flatten, | ||||
|   'utils.flatten: use array-flatten npm module instead'); | ||||
| 
 | ||||
| /** | ||||
|  * Normalize the given `type`, for example "html" becomes "text/html". | ||||
|  * | ||||
|  * @param {String} type | ||||
|  * @return {Object} | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| exports.normalizeType = function(type){ | ||||
|   return ~type.indexOf('/') | ||||
|     ? acceptParams(type) | ||||
|     : { value: mime.lookup(type), params: {} }; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Normalize `types`, for example "html" becomes "text/html". | ||||
|  * | ||||
|  * @param {Array} types | ||||
|  * @return {Array} | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| exports.normalizeTypes = function(types){ | ||||
|   var ret = []; | ||||
| 
 | ||||
|   for (var i = 0; i < types.length; ++i) { | ||||
|     ret.push(exports.normalizeType(types[i])); | ||||
|   } | ||||
| 
 | ||||
|   return ret; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Generate Content-Disposition header appropriate for the filename. | ||||
|  * non-ascii filenames are urlencoded and a filename* parameter is added | ||||
|  * | ||||
|  * @param {String} filename | ||||
|  * @return {String} | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| exports.contentDisposition = deprecate.function(contentDisposition, | ||||
|   'utils.contentDisposition: use content-disposition npm module instead'); | ||||
| 
 | ||||
| /** | ||||
|  * Parse accept params `str` returning an | ||||
|  * object with `.value`, `.quality` and `.params`. | ||||
|  * also includes `.originalIndex` for stable sorting | ||||
|  * | ||||
|  * @param {String} str | ||||
|  * @param {Number} index | ||||
|  * @return {Object} | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| function acceptParams(str, index) { | ||||
|   var parts = str.split(/ *; */); | ||||
|   var ret = { value: parts[0], quality: 1, params: {}, originalIndex: index }; | ||||
| 
 | ||||
|   for (var i = 1; i < parts.length; ++i) { | ||||
|     var pms = parts[i].split(/ *= */); | ||||
|     if ('q' === pms[0]) { | ||||
|       ret.quality = parseFloat(pms[1]); | ||||
|     } else { | ||||
|       ret.params[pms[0]] = pms[1]; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return ret; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Compile "etag" value to function. | ||||
|  * | ||||
|  * @param  {Boolean|String|Function} val | ||||
|  * @return {Function} | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| exports.compileETag = function(val) { | ||||
|   var fn; | ||||
| 
 | ||||
|   if (typeof val === 'function') { | ||||
|     return val; | ||||
|   } | ||||
| 
 | ||||
|   switch (val) { | ||||
|     case true: | ||||
|     case 'weak': | ||||
|       fn = exports.wetag; | ||||
|       break; | ||||
|     case false: | ||||
|       break; | ||||
|     case 'strong': | ||||
|       fn = exports.etag; | ||||
|       break; | ||||
|     default: | ||||
|       throw new TypeError('unknown value for etag function: ' + val); | ||||
|   } | ||||
| 
 | ||||
|   return fn; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Compile "query parser" value to function. | ||||
|  * | ||||
|  * @param  {String|Function} val | ||||
|  * @return {Function} | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| exports.compileQueryParser = function compileQueryParser(val) { | ||||
|   var fn; | ||||
| 
 | ||||
|   if (typeof val === 'function') { | ||||
|     return val; | ||||
|   } | ||||
| 
 | ||||
|   switch (val) { | ||||
|     case true: | ||||
|     case 'simple': | ||||
|       fn = querystring.parse; | ||||
|       break; | ||||
|     case false: | ||||
|       fn = newObject; | ||||
|       break; | ||||
|     case 'extended': | ||||
|       fn = parseExtendedQueryString; | ||||
|       break; | ||||
|     default: | ||||
|       throw new TypeError('unknown value for query parser function: ' + val); | ||||
|   } | ||||
| 
 | ||||
|   return fn; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Compile "proxy trust" value to function. | ||||
|  * | ||||
|  * @param  {Boolean|String|Number|Array|Function} val | ||||
|  * @return {Function} | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| exports.compileTrust = function(val) { | ||||
|   if (typeof val === 'function') return val; | ||||
| 
 | ||||
|   if (val === true) { | ||||
|     // Support plain true/false
 | ||||
|     return function(){ return true }; | ||||
|   } | ||||
| 
 | ||||
|   if (typeof val === 'number') { | ||||
|     // Support trusting hop count
 | ||||
|     return function(a, i){ return i < val }; | ||||
|   } | ||||
| 
 | ||||
|   if (typeof val === 'string') { | ||||
|     // Support comma-separated values
 | ||||
|     val = val.split(',') | ||||
|       .map(function (v) { return v.trim() }) | ||||
|   } | ||||
| 
 | ||||
|   return proxyaddr.compile(val || []); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Set the charset in a given Content-Type string. | ||||
|  * | ||||
|  * @param {String} type | ||||
|  * @param {String} charset | ||||
|  * @return {String} | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| exports.setCharset = function setCharset(type, charset) { | ||||
|   if (!type || !charset) { | ||||
|     return type; | ||||
|   } | ||||
| 
 | ||||
|   // parse type
 | ||||
|   var parsed = contentType.parse(type); | ||||
| 
 | ||||
|   // set charset
 | ||||
|   parsed.parameters.charset = charset; | ||||
| 
 | ||||
|   // format type
 | ||||
|   return contentType.format(parsed); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Create an ETag generator function, generating ETags with | ||||
|  * the given options. | ||||
|  * | ||||
|  * @param {object} options | ||||
|  * @return {function} | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| function createETagGenerator (options) { | ||||
|   return function generateETag (body, encoding) { | ||||
|     var buf = !Buffer.isBuffer(body) | ||||
|       ? Buffer.from(body, encoding) | ||||
|       : body | ||||
| 
 | ||||
|     return etag(buf, options) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Parse an extended query string with qs. | ||||
|  * | ||||
|  * @return {Object} | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| function parseExtendedQueryString(str) { | ||||
|   return qs.parse(str, { | ||||
|     allowPrototypes: true | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Return new empty object. | ||||
|  * | ||||
|  * @return {Object} | ||||
|  * @api private | ||||
|  */ | ||||
| 
 | ||||
| function newObject() { | ||||
|   return {}; | ||||
| } | ||||
							
								
								
									
										182
									
								
								node_modules/express/lib/view.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								node_modules/express/lib/view.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,182 @@ | |||
| /*! | ||||
|  * express | ||||
|  * Copyright(c) 2009-2013 TJ Holowaychuk | ||||
|  * Copyright(c) 2013 Roman Shtylman | ||||
|  * Copyright(c) 2014-2015 Douglas Christopher Wilson | ||||
|  * MIT Licensed | ||||
|  */ | ||||
| 
 | ||||
| 'use strict'; | ||||
| 
 | ||||
| /** | ||||
|  * Module dependencies. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| var debug = require('debug')('express:view'); | ||||
| var path = require('path'); | ||||
| var fs = require('fs'); | ||||
| 
 | ||||
| /** | ||||
|  * Module variables. | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| var dirname = path.dirname; | ||||
| var basename = path.basename; | ||||
| var extname = path.extname; | ||||
| var join = path.join; | ||||
| var resolve = path.resolve; | ||||
| 
 | ||||
| /** | ||||
|  * Module exports. | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| module.exports = View; | ||||
| 
 | ||||
| /** | ||||
|  * Initialize a new `View` with the given `name`. | ||||
|  * | ||||
|  * Options: | ||||
|  * | ||||
|  *   - `defaultEngine` the default template engine name | ||||
|  *   - `engines` template engine require() cache | ||||
|  *   - `root` root path for view lookup | ||||
|  * | ||||
|  * @param {string} name | ||||
|  * @param {object} options | ||||
|  * @public | ||||
|  */ | ||||
| 
 | ||||
| function View(name, options) { | ||||
|   var opts = options || {}; | ||||
| 
 | ||||
|   this.defaultEngine = opts.defaultEngine; | ||||
|   this.ext = extname(name); | ||||
|   this.name = name; | ||||
|   this.root = opts.root; | ||||
| 
 | ||||
|   if (!this.ext && !this.defaultEngine) { | ||||
|     throw new Error('No default engine was specified and no extension was provided.'); | ||||
|   } | ||||
| 
 | ||||
|   var fileName = name; | ||||
| 
 | ||||
|   if (!this.ext) { | ||||
|     // get extension from default engine name
 | ||||
|     this.ext = this.defaultEngine[0] !== '.' | ||||
|       ? '.' + this.defaultEngine | ||||
|       : this.defaultEngine; | ||||
| 
 | ||||
|     fileName += this.ext; | ||||
|   } | ||||
| 
 | ||||
|   if (!opts.engines[this.ext]) { | ||||
|     // load engine
 | ||||
|     var mod = this.ext.slice(1) | ||||
|     debug('require "%s"', mod) | ||||
| 
 | ||||
|     // default engine export
 | ||||
|     var fn = require(mod).__express | ||||
| 
 | ||||
|     if (typeof fn !== 'function') { | ||||
|       throw new Error('Module "' + mod + '" does not provide a view engine.') | ||||
|     } | ||||
| 
 | ||||
|     opts.engines[this.ext] = fn | ||||
|   } | ||||
| 
 | ||||
|   // store loaded engine
 | ||||
|   this.engine = opts.engines[this.ext]; | ||||
| 
 | ||||
|   // lookup path
 | ||||
|   this.path = this.lookup(fileName); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Lookup view by the given `name` | ||||
|  * | ||||
|  * @param {string} name | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| View.prototype.lookup = function lookup(name) { | ||||
|   var path; | ||||
|   var roots = [].concat(this.root); | ||||
| 
 | ||||
|   debug('lookup "%s"', name); | ||||
| 
 | ||||
|   for (var i = 0; i < roots.length && !path; i++) { | ||||
|     var root = roots[i]; | ||||
| 
 | ||||
|     // resolve the path
 | ||||
|     var loc = resolve(root, name); | ||||
|     var dir = dirname(loc); | ||||
|     var file = basename(loc); | ||||
| 
 | ||||
|     // resolve the file
 | ||||
|     path = this.resolve(dir, file); | ||||
|   } | ||||
| 
 | ||||
|   return path; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Render with the given options. | ||||
|  * | ||||
|  * @param {object} options | ||||
|  * @param {function} callback | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| View.prototype.render = function render(options, callback) { | ||||
|   debug('render "%s"', this.path); | ||||
|   this.engine(this.path, options, callback); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Resolve the file within the given directory. | ||||
|  * | ||||
|  * @param {string} dir | ||||
|  * @param {string} file | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| View.prototype.resolve = function resolve(dir, file) { | ||||
|   var ext = this.ext; | ||||
| 
 | ||||
|   // <path>.<ext>
 | ||||
|   var path = join(dir, file); | ||||
|   var stat = tryStat(path); | ||||
| 
 | ||||
|   if (stat && stat.isFile()) { | ||||
|     return path; | ||||
|   } | ||||
| 
 | ||||
|   // <path>/index.<ext>
 | ||||
|   path = join(dir, basename(file, ext), 'index' + ext); | ||||
|   stat = tryStat(path); | ||||
| 
 | ||||
|   if (stat && stat.isFile()) { | ||||
|     return path; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Return a stat, maybe. | ||||
|  * | ||||
|  * @param {string} path | ||||
|  * @return {fs.Stats} | ||||
|  * @private | ||||
|  */ | ||||
| 
 | ||||
| function tryStat(path) { | ||||
|   debug('stat "%s"', path); | ||||
| 
 | ||||
|   try { | ||||
|     return fs.statSync(path); | ||||
|   } catch (e) { | ||||
|     return undefined; | ||||
|   } | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue