Skip to content

Commit c7924e0

Browse files
committed
[fix] callback as optional error handler
1 parent 601dbcb commit c7924e0

File tree

3 files changed

+51
-10
lines changed

3 files changed

+51
-10
lines changed

lib/http-proxy/index.js

+36-5
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,17 @@ function createRightProxy(type) {
3535
});
3636

3737
return function(req, res /*, [head], [opts] */) {
38-
var self = this,
38+
var passes = this.passes || passes,
3939
args = [].slice.call(arguments),
4040
cntr = args.length - 1,
41-
head;
41+
head, cbl;
42+
43+
/* optional args parse begin */
44+
if(typeof args[cntr] === 'function') {
45+
cbl = args[cntr];
46+
47+
cntr--;
48+
}
4249

4350
if(
4451
!(args[cntr] instanceof Buffer) &&
@@ -56,6 +63,8 @@ function createRightProxy(type) {
5663
head = args[cntr];
5764
}
5865

66+
/* optional args parse end */
67+
5968
['target', 'forward'].forEach(function(e) {
6069
if (typeof options[e] === 'string')
6170
options[e] = parse_url(options[e]);
@@ -71,7 +80,7 @@ function createRightProxy(type) {
7180
* refer to the connection socket
7281
* pass(req, socket, options, head)
7382
*/
74-
if(passes[i](req, res, this, head)) { // passes can return a truthy value to halt the loop
83+
if(passes[i](req, res, cbl ? this : false, head, cbl)) { // passes can return a truthy value to halt the loop
7584
break;
7685
}
7786
}
@@ -84,6 +93,10 @@ function ProxyServer(options, web, ws) {
8493
this.web = web;
8594
this.ws = ws;
8695
this.options = options;
96+
97+
this.passes = Object.keys(passes).map(function(pass) {
98+
return passes[pass];
99+
});
87100
}
88101

89102
ProxyServer.prototype.listen = function(port) {
@@ -102,7 +115,25 @@ ProxyServer.prototype.listen = function(port) {
102115
return this;
103116
};
104117

105-
ProxyServer.prototype.before = function() {};
106-
ProxyServer.prototype.after = function() {};
118+
ProxyServer.prototype.before = function(passName, callback) {
119+
var i = false;
120+
this.passes.forEach(function(v, idx) {
121+
if(v.name === passName) i = idx;
122+
})
123+
124+
if(!i) throw new Error('No such pass');
125+
126+
this.passes.splice(i, 0, callback);
127+
};
128+
ProxyServer.prototype.after = function(passName, callback) {
129+
var i = false;
130+
this.passes.forEach(function(v, idx) {
131+
if(v.name === passName) i = idx;
132+
})
133+
134+
if(!i) throw new Error('No such pass');
135+
136+
this.passes.splice(i++, 0, callback);
137+
};
107138

108139
require('util').inherits(ProxyServer, EE3);

lib/http-proxy/passes/web-incoming.js

+8-3
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ web_o = Object.keys(web_o).map(function(pass) {
8989
* @api private
9090
*/
9191

92-
function stream(req, res, server) {
93-
if(options.forward) {
92+
function stream(req, res, server, _, clb) {
93+
if(server.options.forward) {
9494
// If forward enable, so just pipe the request
9595
var forwardReq = (server.options.forward.protocol === 'https:' ? https : http).request(
9696
common.setupOutgoing(server.options.ssl || {}, server.options, req, 'forward')
@@ -106,7 +106,12 @@ web_o = Object.keys(web_o).map(function(pass) {
106106

107107
// Error Handler
108108
proxyReq.on('error', function(err){
109-
server.emit('error', err);
109+
if(server) {
110+
server.emit('error', err);
111+
}
112+
else { 
113+
clb(err);
114+
}
110115
});
111116

112117
req.pipe(proxyReq);

lib/http-proxy/passes/ws-incoming.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ var passes = exports;
9696
*
9797
* @api private
9898
*/
99-
function stream(req, socket, server, head) {
99+
function stream(req, socket, server, head, clb) {
100100
common.setupSocket(socket);
101101

102102
if (head && head.length) socket.unshift(head);
@@ -107,7 +107,12 @@ var passes = exports;
107107
);
108108
// Error Handler
109109
proxyReq.on('error', function(err){
110-
server.emit('error', err);
110+
if(server) {
111+
server.emit('error', err);
112+
}
113+
else {
114+
clb(err);
115+
}
111116
});
112117

113118
proxyReq.on('upgrade', function(proxyRes, proxySocket, proxyHead) {

0 commit comments

Comments
 (0)