You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
3.9 KiB
157 lines
3.9 KiB
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); |
|
};
|
|
|