| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 | var minimatch = require("minimatch");var utils     = exports;utils.applyRules = function overwriteBody (rules, body, req, res) {    return rules.reduce(function (body, rule) {        /**         * Try to use the replace string/fn first         */        if (rule.replace || typeof rule.replace === "string") {            rule.fn = rule.replace;        }        if (typeof rule.fn === 'string') {            return body.replace(rule.match, rule.fn);        }        return body.replace(rule.match, function () {            var args = Array.prototype.slice.call(arguments);            if (typeof rule.fn === 'function') {        	    return rule.fn.apply(this, [req, res].concat(args))            }            return rule.fn;        });    }, body);};/** * Extensions that will be ignored by default * @type {Array} */utils.defaultIgnoreTypes = [    // text files    "js", "json", "css",    // image files    "png", "jpg", "jpeg", "gif", "ico", "tif", "tiff", "bmp", "webp", "psd",    // vector & font    "svg", "woff", "ttf", "otf", "eot", "eps", "ps", "ai",    // audio    "mp3", "wav", "aac", "m4a", "m3u", "mid", "wma",    // video & other media    "mpg", "mpeg", "mp4", "m4v", "webm", "swf", "flv", "avi", "mov", "wmv",    // document files    "pdf", "doc", "docx", "xls", "xlsx", "pps", "ppt", "pptx", "odt", "ods", "odp", "pages", "key", "rtf", "txt", "csv",    // data files    "zip", "rar", "tar", "gz", "xml", "app", "exe", "jar", "dmg", "pkg", "iso"].map(function (ext) {        return "\\." + ext + "(\\?.*)?$";    });/** * Check if a URL was white-listed * @param url * @param whitelist * @returns {boolean} */utils.isWhitelisted = function isWhitelisted(url, whitelist) {    if (whitelist.indexOf(url) > -1) {        return true;    }    return whitelist.some(function (pattern) {        return minimatch(url, pattern);    });};/** * Check if a URL was white-listed with single path * @param url * @param rules * @returns {Array} */utils.isWhiteListedForSingle = function isWhiteListedForSingle(url, rules) {    return rules.filter(function (item) {        return item.paths && utils.isWhitelisted(url, utils.toArray(item.paths));    });};/** * Determine if a response should be overwritten * @param {String} url * @param {Object} opts * @returns {boolean} */utils.inBlackList = function inBlackList(url, opts) {    // First check for an exact match    if (!url || opts.blacklist.indexOf(url) > -1) {        return true;    }    if (url.length === 1 && url === "/") {        return false;    }    // Check the path only    var split = url.split('?')[0];    // second, check that the URL does not contain a    // file extension that should be ignored by default    if (opts.ignore.some(function (pattern) {            return new RegExp(pattern).test(split);        })) {        return true;    }    // Finally, check any mini-match patterns for paths that have been excluded    if (opts.blacklist.some(function (pattern) {            return minimatch(url, pattern);        })) {        return true;    }    return false;};/** * @param req * @returns {Boolean} */utils.hasAcceptHeaders = function hasAcceptHeaders(req) {    var acceptHeader = req.headers["accept"];    if (!acceptHeader) {        return false;    }    return acceptHeader.indexOf("html") > -1;};/** * @param body * @returns {boolean} */utils.snip = function snip(body) {    if (!body) {        return false;    }};utils.toArray = function toArray(item) {    if (!item) {        return item;    }    if (!Array.isArray(item)) {        return [item];    }    return item;};utils.isHtml = function isHtml(str) {    if (!str) {        return false;    }    // Test to see if start of file contents matches:    // - Optional byte-order mark (BOM)    // - Zero or more spaces    // - Any sort of HTML tag, comment, or doctype tag (basically, <...>)    return /^(\uFEFF|\uFFFE)?\s*<[^>]+>/i.test(str);};
 |