1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- var URL = require('url');
- module.exports = function (options) {
- var parent = this;
- var opts = typeof options === 'function' ? {custom: options} : options;
- opts.useOriginalUrl = (typeof opts.useOriginalUrl === 'undefined') ? true : opts.useOriginalUrl;
- return function (req, res, next) {
- var url = URL.parse((opts.useOriginalUrl ? req.originalUrl : req.url) || req.url || '', true);
- var skip = false;
- if (opts.custom) {
- skip = skip || opts.custom(req);
- }
- var paths = !opts.path || Array.isArray(opts.path) ?
- opts.path : [opts.path];
- if (paths) {
- skip = skip || paths.some(function (p) {
- return isUrlMatch(p, url.pathname) && isMethodMatch(p.methods, req.method);
- });
- }
- var exts = (!opts.ext || Array.isArray(opts.ext)) ?
- opts.ext : [opts.ext];
- if (exts) {
- skip = skip || exts.some(function (ext) {
- return url.pathname.substr(ext.length * -1) === ext;
- });
- }
- var methods = (!opts.method || Array.isArray(opts.method)) ?
- opts.method : [opts.method];
- if (methods) {
- skip = skip || !!~methods.indexOf(req.method);
- }
- if (skip) {
- return next();
- }
- parent(req, res, next);
- };
- };
- function isUrlMatch(p, url) {
- var ret = (typeof p === 'string' && p === url) || (p instanceof RegExp && !!p.exec(url));
- if (p instanceof RegExp) {
- p.lastIndex = 0;
- }
- if (p && p.url) {
- ret = isUrlMatch(p.url, url)
- }
- return ret;
- }
- function isMethodMatch(methods, m) {
- if (!methods) {
- return true;
- }
- methods = Array.isArray(methods) ? methods : [methods];
- return !!~methods.indexOf(m);
- }
|