Express Server erstellt
This commit is contained in:
		
							
								
								
									
										644
									
								
								express-server/node_modules/express/lib/application.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										644
									
								
								express-server/node_modules/express/lib/application.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,644 @@
 | 
			
		||||
/*!
 | 
			
		||||
 * 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')
 | 
			
		||||
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 middleware functions');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // 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 dont 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.get('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)
 | 
			
		||||
    return this.settings[setting];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										111
									
								
								express-server/node_modules/express/lib/express.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								express-server/node_modules/express/lib/express.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,111 @@
 | 
			
		||||
/*!
 | 
			
		||||
 * 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 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.query = require('./middleware/query');
 | 
			
		||||
exports.static = require('serve-static');
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Replace removed middleware with an appropriate error message.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
[
 | 
			
		||||
  'json',
 | 
			
		||||
  'urlencoded',
 | 
			
		||||
  'bodyParser',
 | 
			
		||||
  'compress',
 | 
			
		||||
  'cookieSession',
 | 
			
		||||
  'session',
 | 
			
		||||
  'logger',
 | 
			
		||||
  'cookieParser',
 | 
			
		||||
  'favicon',
 | 
			
		||||
  'responseTime',
 | 
			
		||||
  'errorHandler',
 | 
			
		||||
  'timeout',
 | 
			
		||||
  'methodOverride',
 | 
			
		||||
  'vhost',
 | 
			
		||||
  'csrf',
 | 
			
		||||
  'directory',
 | 
			
		||||
  'limit',
 | 
			
		||||
  'multipart',
 | 
			
		||||
  'staticCache',
 | 
			
		||||
].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
									
								
								express-server/node_modules/express/lib/middleware/init.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								express-server/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
									
								
								express-server/node_modules/express/lib/middleware/query.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								express-server/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();
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										517
									
								
								express-server/node_modules/express/lib/request.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										517
									
								
								express-server/node_modules/express/lib/request.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,517 @@
 | 
			
		||||
/*!
 | 
			
		||||
 * 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 give 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.
 | 
			
		||||
  proto = this.get('X-Forwarded-Proto') || proto;
 | 
			
		||||
  return proto.split(/\s*,\s*/)[0];
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1076
									
								
								express-server/node_modules/express/lib/response.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1076
									
								
								express-server/node_modules/express/lib/response.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										662
									
								
								express-server/node_modules/express/lib/router/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										662
									
								
								express-server/node_modules/express/lib/router/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,662 @@
 | 
			
		||||
/*!
 | 
			
		||||
 * 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.substr(1)) + ', fn) instead');
 | 
			
		||||
    name = name.substr(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 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.substr(1);
 | 
			
		||||
      slashAdded = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // restore altered req.url
 | 
			
		||||
    if (removed.length !== 0) {
 | 
			
		||||
      req.baseUrl = parentUrl;
 | 
			
		||||
      req.url = protohost + removed + req.url.substr(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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 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;
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 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) {
 | 
			
		||||
        return next(layerError || err);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (route) {
 | 
			
		||||
        return layer.handle_request(req, res, next);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      trim_prefix(layer, layerError, layerPath, path);
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function trim_prefix(layer, layerError, layerPath, path) {
 | 
			
		||||
    if (layerPath.length !== 0) {
 | 
			
		||||
      // 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.substr(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 middleware functions');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  for (var i = 0; i < callbacks.length; i++) {
 | 
			
		||||
    var fn = callbacks[i];
 | 
			
		||||
 | 
			
		||||
    if (typeof fn !== 'function') {
 | 
			
		||||
      throw new TypeError('Router.use() requires 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.substr(0, pathLength).indexOf('://')
 | 
			
		||||
 | 
			
		||||
  return fqdnIndex !== -1
 | 
			
		||||
    ? url.substr(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
									
								
								express-server/node_modules/express/lib/router/layer.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										181
									
								
								express-server/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;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										216
									
								
								express-server/node_modules/express/lib/router/route.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								express-server/node_modules/express/lib/router/route.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,216 @@
 | 
			
		||||
/*!
 | 
			
		||||
 * 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;
 | 
			
		||||
  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)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var layer = stack[idx++];
 | 
			
		||||
    if (!layer) {
 | 
			
		||||
      return done(err);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (layer.method && layer.method !== method) {
 | 
			
		||||
      return next(err);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (err) {
 | 
			
		||||
      layer.handle_error(err, req, res, next);
 | 
			
		||||
    } else {
 | 
			
		||||
      layer.handle_request(req, res, next);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 callback functions 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 callback functions 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;
 | 
			
		||||
  };
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										298
									
								
								express-server/node_modules/express/lib/utils.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										298
									
								
								express-server/node_modules/express/lib/utils.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,298 @@
 | 
			
		||||
/*!
 | 
			
		||||
 * express
 | 
			
		||||
 * Copyright(c) 2009-2013 TJ Holowaychuk
 | 
			
		||||
 * Copyright(c) 2014-2015 Douglas Christopher Wilson
 | 
			
		||||
 * MIT Licensed
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
'use strict';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Module dependencies.
 | 
			
		||||
 * @api private
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
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 = function (body, encoding) {
 | 
			
		||||
  var buf = !Buffer.isBuffer(body)
 | 
			
		||||
    ? new Buffer(body, encoding)
 | 
			
		||||
    : body;
 | 
			
		||||
 | 
			
		||||
  return etag(buf, {weak: false});
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Return weak ETag for `body`.
 | 
			
		||||
 *
 | 
			
		||||
 * @param {String|Buffer} body
 | 
			
		||||
 * @param {String} [encoding]
 | 
			
		||||
 * @return {String}
 | 
			
		||||
 * @api private
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
exports.wetag = function wetag(body, encoding){
 | 
			
		||||
  var buf = !Buffer.isBuffer(body)
 | 
			
		||||
    ? new Buffer(body, encoding)
 | 
			
		||||
    : body;
 | 
			
		||||
 | 
			
		||||
  return etag(buf, {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
 | 
			
		||||
 * @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:
 | 
			
		||||
      fn = exports.wetag;
 | 
			
		||||
      break;
 | 
			
		||||
    case false:
 | 
			
		||||
      break;
 | 
			
		||||
    case 'strong':
 | 
			
		||||
      fn = exports.etag;
 | 
			
		||||
      break;
 | 
			
		||||
    case 'weak':
 | 
			
		||||
      fn = exports.wetag;
 | 
			
		||||
      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:
 | 
			
		||||
      fn = querystring.parse;
 | 
			
		||||
      break;
 | 
			
		||||
    case false:
 | 
			
		||||
      fn = newObject;
 | 
			
		||||
      break;
 | 
			
		||||
    case 'extended':
 | 
			
		||||
      fn = parseExtendedQueryString;
 | 
			
		||||
      break;
 | 
			
		||||
    case 'simple':
 | 
			
		||||
      fn = querystring.parse;
 | 
			
		||||
      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(/ *, */);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 {};
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										174
									
								
								express-server/node_modules/express/lib/view.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								express-server/node_modules/express/lib/view.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,174 @@
 | 
			
		||||
/*!
 | 
			
		||||
 * 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.substr(1)
 | 
			
		||||
    debug('require "%s"', mod)
 | 
			
		||||
    opts.engines[this.ext] = require(mod).__express
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // 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;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user