| var _ = require('lodash') |
| var url = require('url') |
| var ERRORS = require('./errors') |
| var logger = require('./logger').getInstance() |
| |
| module.exports = { |
| createConfig: createConfig |
| } |
| |
| function createConfig(context, opts) { |
| // structure of config object to be returned |
| var config = { |
| context: undefined, |
| options: {} |
| } |
| |
| // app.use('/api', proxy({target:'http://localhost:9000'})); |
| if (isContextless(context, opts)) { |
| config.context = '/' |
| config.options = _.assign(config.options, context) |
| |
| // app.use('/api', proxy('http://localhost:9000')); |
| // app.use(proxy('http://localhost:9000/api')); |
| } else if (isStringShortHand(context)) { |
| var oUrl = url.parse(context) |
| var target = [oUrl.protocol, '//', oUrl.host].join('') |
| |
| config.context = oUrl.pathname || '/' |
| config.options = _.assign(config.options, { target: target }, opts) |
| |
| if (oUrl.protocol === 'ws:' || oUrl.protocol === 'wss:') { |
| config.options.ws = true |
| } |
| // app.use('/api', proxy({target:'http://localhost:9000'})); |
| } else { |
| config.context = context |
| config.options = _.assign(config.options, opts) |
| } |
| |
| configureLogger(config.options) |
| |
| if (!config.options.target) { |
| throw new Error(ERRORS.ERR_CONFIG_FACTORY_TARGET_MISSING) |
| } |
| |
| // Legacy option.proxyHost |
| config.options = mapLegacyProxyHostOption(config.options) |
| |
| // Legacy option.proxyTable > option.router |
| config.options = mapLegacyProxyTableOption(config.options) |
| |
| return config |
| } |
| |
| /** |
| * Checks if a String only target/config is provided. |
| * This can be just the host or with the optional path. |
| * |
| * @example |
| * app.use('/api', proxy('http://localhost:9000')); |
| app.use(proxy('http://localhost:9000/api')); |
| * |
| * @param {String} context [description] |
| * @return {Boolean} [description] |
| */ |
| function isStringShortHand(context) { |
| if (_.isString(context)) { |
| return !!url.parse(context).host |
| } |
| } |
| |
| /** |
| * Checks if a Object only config is provided, without a context. |
| * In this case the all paths will be proxied. |
| * |
| * @example |
| * app.use('/api', proxy({target:'http://localhost:9000'})); |
| * |
| * @param {Object} context [description] |
| * @param {*} opts [description] |
| * @return {Boolean} [description] |
| */ |
| function isContextless(context, opts) { |
| return _.isPlainObject(context) && _.isEmpty(opts) |
| } |
| |
| function mapLegacyProxyHostOption(options) { |
| // set options.headers.host when option.proxyHost is provided |
| if (options.proxyHost) { |
| logger.warn('*************************************') |
| logger.warn('[HPM] Deprecated "option.proxyHost"') |
| logger.warn( |
| ' Use "option.changeOrigin" or "option.headers.host" instead' |
| ) |
| logger.warn(' "option.proxyHost" will be removed in future release.') |
| logger.warn('*************************************') |
| |
| options.headers = options.headers || {} |
| options.headers.host = options.proxyHost |
| } |
| |
| return options |
| } |
| |
| // Warn deprecated proxyTable api usage |
| function mapLegacyProxyTableOption(options) { |
| if (options.proxyTable) { |
| logger.warn('*************************************') |
| logger.warn('[HPM] Deprecated "option.proxyTable"') |
| logger.warn(' Use "option.router" instead') |
| logger.warn(' "option.proxyTable" will be removed in future release.') |
| logger.warn('*************************************') |
| |
| options.router = _.clone(options.proxyTable) |
| _.omit(options, 'proxyTable') |
| } |
| |
| return options |
| } |
| |
| function configureLogger(options) { |
| if (options.logLevel) { |
| logger.setLevel(options.logLevel) |
| } |
| |
| if (options.logProvider) { |
| logger.setProvider(options.logProvider) |
| } |
| } |