80 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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
 | |
| }
 |