var _ = require('lodash') var logger = require('./logger').getInstance() var ERRORS = require('./errors') module.exports = { create: createPathRewriter } /** * Create rewrite function, to cache parsed rewrite rules. * * @param {Object} rewriteConfig * @return {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(ERRORS.ERR_PATH_REWRITER_CONFIG) } } 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 }