http-proxy-middleware 0.17.4 → 0.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -1,147 +1,182 @@
1
- var _ = require('lodash');
2
- var httpProxy = require('http-proxy');
3
- var configFactory = require('./config-factory');
4
- var handlers = require('./handlers');
5
- var contextMatcher = require('./context-matcher');
6
- var PathRewriter = require('./path-rewriter');
7
- var Router = require('./router');
8
- var logger = require('./logger').getInstance();
9
- var getArrow = require('./logger').getArrow;
10
-
11
- module.exports = HttpProxyMiddleware;
1
+ var _ = require('lodash')
2
+ var httpProxy = require('http-proxy')
3
+ var configFactory = require('./config-factory')
4
+ var handlers = require('./handlers')
5
+ var contextMatcher = require('./context-matcher')
6
+ var PathRewriter = require('./path-rewriter')
7
+ var Router = require('./router')
8
+ var logger = require('./logger').getInstance()
9
+ var getArrow = require('./logger').getArrow
10
+
11
+ module.exports = HttpProxyMiddleware
12
12
 
13
13
  function HttpProxyMiddleware(context, opts) {
14
- // https://github.com/chimurai/http-proxy-middleware/issues/57
15
- var wsUpgradeDebounced = _.debounce(handleUpgrade);
16
- var wsInitialized = false;
17
- var config = configFactory.createConfig(context, opts);
18
- var proxyOptions = config.options;
19
-
20
- // create proxy
21
- var proxy = httpProxy.createProxyServer({});
22
- logger.info('[HPM] Proxy created:', config.context, ' -> ', proxyOptions.target);
23
-
24
- var pathRewriter = PathRewriter.create(proxyOptions.pathRewrite); // returns undefined when "pathRewrite" is not provided
25
-
26
- // attach handler to http-proxy events
27
- handlers.init(proxy, proxyOptions);
28
-
29
- // log errors for debug purpose
30
- proxy.on('error', logError);
31
-
32
- // https://github.com/chimurai/http-proxy-middleware/issues/19
33
- // expose function to upgrade externally
34
- middleware.upgrade = wsUpgradeDebounced;
35
-
36
- return middleware;
37
-
38
- function middleware(req, res, next) {
39
- if (shouldProxy(config.context, req)) {
40
- var activeProxyOptions = prepareProxyRequest(req);
41
- proxy.web(req, res, activeProxyOptions);
42
- } else {
43
- next();
44
- }
45
-
46
- if (proxyOptions.ws === true) {
47
- // use initial request to access the server object to subscribe to http upgrade event
48
- catchUpgradeRequest(req.connection.server);
49
- }
14
+ // https://github.com/chimurai/http-proxy-middleware/issues/57
15
+ var wsUpgradeDebounced = _.debounce(handleUpgrade)
16
+ var wsInitialized = false
17
+ var config = configFactory.createConfig(context, opts)
18
+ var proxyOptions = config.options
19
+
20
+ // create proxy
21
+ var proxy = httpProxy.createProxyServer({})
22
+ logger.info(
23
+ '[HPM] Proxy created:',
24
+ config.context,
25
+ ' -> ',
26
+ proxyOptions.target
27
+ )
28
+
29
+ var pathRewriter = PathRewriter.create(proxyOptions.pathRewrite) // returns undefined when "pathRewrite" is not provided
30
+
31
+ // attach handler to http-proxy events
32
+ handlers.init(proxy, proxyOptions)
33
+
34
+ // log errors for debug purpose
35
+ proxy.on('error', logError)
36
+
37
+ // https://github.com/chimurai/http-proxy-middleware/issues/19
38
+ // expose function to upgrade externally
39
+ middleware.upgrade = wsUpgradeDebounced
40
+
41
+ return middleware
42
+
43
+ function middleware(req, res, next) {
44
+ if (shouldProxy(config.context, req)) {
45
+ var activeProxyOptions = prepareProxyRequest(req)
46
+ proxy.web(req, res, activeProxyOptions)
47
+ } else {
48
+ next()
50
49
  }
51
50
 
52
- function catchUpgradeRequest(server) {
53
- // subscribe once; don't subscribe on every request...
54
- // https://github.com/chimurai/http-proxy-middleware/issues/113
55
- if (!wsInitialized) {
56
- server.on('upgrade', wsUpgradeDebounced);
57
- wsInitialized = true;
58
- }
51
+ if (proxyOptions.ws === true) {
52
+ // use initial request to access the server object to subscribe to http upgrade event
53
+ catchUpgradeRequest(req.connection.server)
59
54
  }
55
+ }
56
+
57
+ function catchUpgradeRequest(server) {
58
+ // subscribe once; don't subscribe on every request...
59
+ // https://github.com/chimurai/http-proxy-middleware/issues/113
60
+ if (!wsInitialized) {
61
+ server.on('upgrade', wsUpgradeDebounced)
62
+ wsInitialized = true
63
+ }
64
+ }
60
65
 
61
- function handleUpgrade(req, socket, head) {
62
- // set to initialized when used externally
63
- wsInitialized = true;
66
+ function handleUpgrade(req, socket, head) {
67
+ // set to initialized when used externally
68
+ wsInitialized = true
64
69
 
65
- if (shouldProxy(config.context, req)) {
66
- var activeProxyOptions = prepareProxyRequest(req);
67
- proxy.ws(req, socket, head, activeProxyOptions);
68
- logger.info('[HPM] Upgrading to WebSocket');
69
- }
70
+ if (shouldProxy(config.context, req)) {
71
+ var activeProxyOptions = prepareProxyRequest(req)
72
+ proxy.ws(req, socket, head, activeProxyOptions)
73
+ logger.info('[HPM] Upgrading to WebSocket')
70
74
  }
71
-
72
- /**
73
- * Determine whether request should be proxied.
74
- *
75
- * @private
76
- * @return {Boolean}
77
- */
78
- function shouldProxy(context, req) {
79
- var path = (req.originalUrl || req.url);
80
- return contextMatcher.match(context, path, req);
75
+ }
76
+
77
+ /**
78
+ * Determine whether request should be proxied.
79
+ *
80
+ * @private
81
+ * @param {String} context [description]
82
+ * @param {Object} req [description]
83
+ * @return {Boolean}
84
+ */
85
+ function shouldProxy(context, req) {
86
+ var path = req.originalUrl || req.url
87
+ return contextMatcher.match(context, path, req)
88
+ }
89
+
90
+ /**
91
+ * Apply option.router and option.pathRewrite
92
+ * Order matters:
93
+ * Router uses original path for routing;
94
+ * NOT the modified path, after it has been rewritten by pathRewrite
95
+ * @param {Object} req
96
+ * @return {Object} proxy options
97
+ */
98
+ function prepareProxyRequest(req) {
99
+ // https://github.com/chimurai/http-proxy-middleware/issues/17
100
+ // https://github.com/chimurai/http-proxy-middleware/issues/94
101
+ req.url = req.originalUrl || req.url
102
+
103
+ // store uri before it gets rewritten for logging
104
+ var originalPath = req.url
105
+ var newProxyOptions = _.assign({}, proxyOptions)
106
+
107
+ // Apply in order:
108
+ // 1. option.router
109
+ // 2. option.pathRewrite
110
+ __applyRouter(req, newProxyOptions)
111
+ __applyPathRewrite(req, pathRewriter)
112
+
113
+ // debug logging for both http(s) and websockets
114
+ if (proxyOptions.logLevel === 'debug') {
115
+ var arrow = getArrow(
116
+ originalPath,
117
+ req.url,
118
+ proxyOptions.target,
119
+ newProxyOptions.target
120
+ )
121
+ logger.debug(
122
+ '[HPM] %s %s %s %s',
123
+ req.method,
124
+ originalPath,
125
+ arrow,
126
+ newProxyOptions.target
127
+ )
81
128
  }
82
129
 
83
- /**
84
- * Apply option.router and option.pathRewrite
85
- * Order matters:
86
- Router uses original path for routing;
87
- NOT the modified path, after it has been rewritten by pathRewrite
88
- */
89
- function prepareProxyRequest(req) {
90
- // https://github.com/chimurai/http-proxy-middleware/issues/17
91
- // https://github.com/chimurai/http-proxy-middleware/issues/94
92
- req.url = (req.originalUrl || req.url);
93
-
94
- // store uri before it gets rewritten for logging
95
- var originalPath = req.url;
96
- var newProxyOptions = _.assign({}, proxyOptions);
97
-
98
- // Apply in order:
99
- // 1. option.router
100
- // 2. option.pathRewrite
101
- __applyRouter(req, newProxyOptions);
102
- __applyPathRewrite(req, pathRewriter);
103
-
104
- // debug logging for both http(s) and websockets
105
- if (proxyOptions.logLevel === 'debug') {
106
- var arrow = getArrow(originalPath, req.url, proxyOptions.target, newProxyOptions.target);
107
- logger.debug('[HPM] %s %s %s %s', req.method, originalPath, arrow, newProxyOptions.target);
108
- }
109
-
110
- return newProxyOptions;
111
- }
130
+ return newProxyOptions
131
+ }
112
132
 
113
- // Modify option.target when router present.
114
- function __applyRouter(req, options) {
115
- var newTarget;
133
+ // Modify option.target when router present.
134
+ function __applyRouter(req, options) {
135
+ var newTarget
116
136
 
117
- if (options.router) {
118
- newTarget = Router.getTarget(req, options);
137
+ if (options.router) {
138
+ newTarget = Router.getTarget(req, options)
119
139
 
120
- if (newTarget) {
121
- logger.debug('[HPM] Router new target: %s -> "%s"', options.target, newTarget);
122
- options.target = newTarget;
123
- }
124
- }
140
+ if (newTarget) {
141
+ logger.debug(
142
+ '[HPM] Router new target: %s -> "%s"',
143
+ options.target,
144
+ newTarget
145
+ )
146
+ options.target = newTarget
147
+ }
125
148
  }
126
-
127
- // rewrite path
128
- function __applyPathRewrite(req, pathRewriter) {
129
- if (pathRewriter) {
130
- var path = pathRewriter(req.url, req);
131
-
132
- if (typeof path === 'string') {
133
- req.url = path;
134
- } else {
135
- logger.info('[HPM] pathRewrite: No rewritten path found. (%s)', req.url);
136
- }
137
- }
138
- }
139
-
140
- function logError(err, req, res) {
141
- var hostname = (req.headers && req.headers.host) || (req.hostname || req.host); // (websocket) || (node0.10 || node 4/5)
142
- var target = proxyOptions.target.host || proxyOptions.target;
143
- var errReference = 'https://nodejs.org/api/errors.html#errors_common_system_errors'; // link to Node Common Systems Errors page
144
-
145
- logger.error('[HPM] Error occurred while trying to proxy request %s from %s to %s (%s) (%s)', req.url, hostname, target, err.code, errReference);
149
+ }
150
+
151
+ // rewrite path
152
+ function __applyPathRewrite(req, pathRewriter) {
153
+ if (pathRewriter) {
154
+ var path = pathRewriter(req.url, req)
155
+
156
+ if (typeof path === 'string') {
157
+ req.url = path
158
+ } else {
159
+ logger.info('[HPM] pathRewrite: No rewritten path found. (%s)', req.url)
160
+ }
146
161
  }
147
- };
162
+ }
163
+
164
+ function logError(err, req, res) {
165
+ var hostname =
166
+ (req.headers && req.headers.host) || (req.hostname || req.host) // (websocket) || (node0.10 || node 4/5)
167
+ var target = proxyOptions.target.host || proxyOptions.target
168
+ var errorMessage =
169
+ '[HPM] Error occurred while trying to proxy request %s from %s to %s (%s) (%s)'
170
+ var errReference =
171
+ 'https://nodejs.org/api/errors.html#errors_common_system_errors' // link to Node Common Systems Errors page
172
+
173
+ logger.error(
174
+ errorMessage,
175
+ req.url,
176
+ hostname,
177
+ target,
178
+ err.code || err,
179
+ errReference
180
+ )
181
+ }
182
+ }
package/lib/logger.js CHANGED
@@ -1,144 +1,144 @@
1
- var util = require('util');
2
- var _ = require('lodash');
1
+ var util = require('util')
2
+ var _ = require('lodash')
3
3
 
4
- var loggerInstance;
4
+ var loggerInstance
5
5
 
6
6
  var defaultProvider = {
7
- log: console.log,
8
- debug: console.log, // use .log(); since console does not have .debug()
9
- info: console.info,
10
- warn: console.warn,
11
- error: console.error
12
- };
7
+ log: console.log,
8
+ debug: console.log, // use .log(); since console does not have .debug()
9
+ info: console.info,
10
+ warn: console.warn,
11
+ error: console.error
12
+ }
13
13
 
14
14
  // log level 'weight'
15
15
  var LEVELS = {
16
- debug: 10,
17
- info: 20,
18
- warn: 30,
19
- error: 50,
20
- silent: 80
21
- };
16
+ debug: 10,
17
+ info: 20,
18
+ warn: 30,
19
+ error: 50,
20
+ silent: 80
21
+ }
22
22
 
23
23
  module.exports = {
24
- // singleton
25
- getInstance: function() {
26
- if (!loggerInstance) {
27
- loggerInstance = new Logger();
28
- }
24
+ // singleton
25
+ getInstance: function() {
26
+ if (!loggerInstance) {
27
+ loggerInstance = new Logger()
28
+ }
29
29
 
30
- return loggerInstance;
31
- },
32
- getArrow: getArrow
33
- };
30
+ return loggerInstance
31
+ },
32
+ getArrow: getArrow
33
+ }
34
34
 
35
35
  function Logger() {
36
- var logLevel;
37
- var provider;
38
-
39
- var api = {
40
- log: log,
41
- debug: debug,
42
- info: info,
43
- warn: warn,
44
- error: error,
45
- setLevel: function(v) {
46
- if (isValidLevel(v)) {
47
- logLevel = v;
48
- }
49
- },
50
- setProvider: function(fn) {
51
- if (fn && isValidProvider(fn)) {
52
- provider = fn(defaultProvider);
53
- }
54
- }
55
- };
56
-
57
- init();
58
-
59
- return api;
60
-
61
- function init() {
62
- api.setLevel('info');
63
- api.setProvider(function() {
64
- return defaultProvider;
65
- });
36
+ var logLevel
37
+ var provider
38
+
39
+ var api = {
40
+ log: log,
41
+ debug: debug,
42
+ info: info,
43
+ warn: warn,
44
+ error: error,
45
+ setLevel: function(v) {
46
+ if (isValidLevel(v)) {
47
+ logLevel = v
48
+ }
49
+ },
50
+ setProvider: function(fn) {
51
+ if (fn && isValidProvider(fn)) {
52
+ provider = fn(defaultProvider)
53
+ }
66
54
  }
55
+ }
67
56
 
68
- // log will log messages, regardless of logLevels
69
- function log() {
70
- provider.log(_interpolate.apply(null, arguments));
71
- }
57
+ init()
72
58
 
73
- function debug() {
74
- if (_showLevel('debug')) {
75
- provider.debug(_interpolate.apply(null, arguments));
76
- }
77
- }
59
+ return api
78
60
 
79
- function info() {
80
- if (_showLevel('info')) {
81
- provider.info(_interpolate.apply(null, arguments));
82
- }
83
- }
61
+ function init() {
62
+ api.setLevel('info')
63
+ api.setProvider(function() {
64
+ return defaultProvider
65
+ })
66
+ }
84
67
 
85
- function warn() {
86
- if (_showLevel('warn')) {
87
- provider.warn(_interpolate.apply(null, arguments));
88
- }
89
- }
68
+ // log will log messages, regardless of logLevels
69
+ function log() {
70
+ provider.log(_interpolate.apply(null, arguments))
71
+ }
90
72
 
91
- function error() {
92
- if (_showLevel('error')) {
93
- provider.error(_interpolate.apply(null, arguments));
94
- }
73
+ function debug() {
74
+ if (_showLevel('debug')) {
75
+ provider.debug(_interpolate.apply(null, arguments))
95
76
  }
77
+ }
96
78
 
97
- /**
98
- * Decide to log or not to log, based on the log levels 'weight'
99
- * @param {String} showLevel [debug, info, warn, error, silent]
100
- * @return {Boolean}
101
- */
102
- function _showLevel(showLevel) {
103
- var result = false;
104
- var currentLogLevel = LEVELS[logLevel];
79
+ function info() {
80
+ if (_showLevel('info')) {
81
+ provider.info(_interpolate.apply(null, arguments))
82
+ }
83
+ }
105
84
 
106
- if (currentLogLevel && (currentLogLevel <= LEVELS[showLevel])) {
107
- result = true;
108
- }
85
+ function warn() {
86
+ if (_showLevel('warn')) {
87
+ provider.warn(_interpolate.apply(null, arguments))
88
+ }
89
+ }
109
90
 
110
- return result;
91
+ function error() {
92
+ if (_showLevel('error')) {
93
+ provider.error(_interpolate.apply(null, arguments))
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Decide to log or not to log, based on the log levels 'weight'
99
+ * @param {String} showLevel [debug, info, warn, error, silent]
100
+ * @return {Boolean}
101
+ */
102
+ function _showLevel(showLevel) {
103
+ var result = false
104
+ var currentLogLevel = LEVELS[logLevel]
105
+
106
+ if (currentLogLevel && currentLogLevel <= LEVELS[showLevel]) {
107
+ result = true
111
108
  }
112
109
 
113
- // make sure logged messages and its data are return interpolated
114
- // make it possible for additional log data, such date/time or custom prefix.
115
- function _interpolate() {
116
- var fn = _.spread(util.format);
117
- var result = fn(_.slice(arguments));
110
+ return result
111
+ }
118
112
 
119
- return result;
120
- }
113
+ // make sure logged messages and its data are return interpolated
114
+ // make it possible for additional log data, such date/time or custom prefix.
115
+ function _interpolate() {
116
+ var fn = _.spread(util.format)
117
+ var result = fn(_.slice(arguments))
121
118
 
122
- function isValidProvider(fnProvider) {
123
- var result = true;
119
+ return result
120
+ }
124
121
 
125
- if (fnProvider && !_.isFunction(fnProvider)) {
126
- throw new Error('[HPM] Log provider config error. Expecting a function.');
127
- }
122
+ function isValidProvider(fnProvider) {
123
+ var result = true
128
124
 
129
- return result;
125
+ if (fnProvider && !_.isFunction(fnProvider)) {
126
+ throw new Error('[HPM] Log provider config error. Expecting a function.')
130
127
  }
131
128
 
132
- function isValidLevel(levelName) {
133
- var validLevels = _.keys(LEVELS);
134
- var isValid = _.includes(validLevels, levelName);
129
+ return result
130
+ }
135
131
 
136
- if (!isValid) {
137
- throw new Error('[HPM] Log level error. Invalid logLevel.');
138
- }
132
+ function isValidLevel(levelName) {
133
+ var validLevels = _.keys(LEVELS)
134
+ var isValid = _.includes(validLevels, levelName)
139
135
 
140
- return isValid;
136
+ if (!isValid) {
137
+ throw new Error('[HPM] Log level error. Invalid logLevel.')
141
138
  }
139
+
140
+ return isValid
141
+ }
142
142
  }
143
143
 
144
144
  /**
@@ -146,13 +146,27 @@ function Logger() {
146
146
  * => router
147
147
  * ~> pathRewrite
148
148
  * ≈> router + pathRewrite
149
+ *
150
+ * @param {String} originalPath
151
+ * @param {String} newPath
152
+ * @param {String} originalTarget
153
+ * @param {String} newTarget
154
+ * @return {String}
149
155
  */
150
156
  function getArrow(originalPath, newPath, originalTarget, newTarget) {
151
- var arrow = ['>'];
152
- var isNewTarget = (originalTarget !== newTarget); // router
153
- var isNewPath = (originalPath !== newPath); // pathRewrite
154
-
155
- if (isNewPath && !isNewTarget) {arrow.unshift('~');} else if (!isNewPath && isNewTarget) {arrow.unshift('=');} else if (isNewPath && isNewTarget) {arrow.unshift('≈');} else {arrow.unshift('-');}
156
-
157
- return arrow.join('');
157
+ var arrow = ['>']
158
+ var isNewTarget = originalTarget !== newTarget // router
159
+ var isNewPath = originalPath !== newPath // pathRewrite
160
+
161
+ if (isNewPath && !isNewTarget) {
162
+ arrow.unshift('~')
163
+ } else if (!isNewPath && isNewTarget) {
164
+ arrow.unshift('=')
165
+ } else if (isNewPath && isNewTarget) {
166
+ arrow.unshift('≈')
167
+ } else {
168
+ arrow.unshift('-')
169
+ }
170
+
171
+ return arrow.join('')
158
172
  }