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);
- };
|