var _ = require('lodash'); var logger = require('./logger').getInstance(); module.exports = { create: createPathRewriter }; /** * Create rewrite function, to cache parsed rewrite rules. * * @returns {function} Function to rewrite paths; This function should accept `path` (request.url) as parameter */ function createPathRewriter(rewriteConfig) { var rulesCache; if (!isValidRewriteConfig(rewriteConfig)) { return; } if (_.isFunction(rewriteConfig)) { var customRewriteFn = rewriteConfig; return customRewriteFn; } else { rulesCache = parsePathRewriteRules(rewriteConfig); return rewritePath; } function rewritePath(path) { var result = path; _.forEach(rulesCache, function(rule) { if (rule.regex.test(path)) { result = result.replace(rule.regex, rule.value); logger.debug('[HPM] Rewriting path from "%s" to "%s"', path, result); return false; } }); return result; } } function isValidRewriteConfig(rewriteConfig) { if (_.isFunction(rewriteConfig)) { return true; } else if (!_.isEmpty(rewriteConfig) && _.isPlainObject(rewriteConfig)) { return true; } else if (_.isUndefined(rewriteConfig) || _.isNull(rewriteConfig) || _.isEqual(rewriteConfig, {})) { return false; } else { throw new Error('[HPM] Invalid pathRewrite config. Expecting object with pathRewrite config or a rewrite function'); } } function parsePathRewriteRules(rewriteConfig) { var rules = []; if (_.isPlainObject(rewriteConfig)) { _.forIn(rewriteConfig, function(value, key) { rules.push({ regex: new RegExp(key), value: rewriteConfig[key] }); logger.info('[HPM] Proxy rewrite rule created: "%s" ~> "%s"', key, rewriteConfig[key]); }); } return rules; }