From c2e6deae5dab78187a8b09ce5256fb09db390bc9 Mon Sep 17 00:00:00 2001 From: William Blankenship Date: Tue, 19 Sep 2017 09:58:41 -0700 Subject: [PATCH] fix(server): error in pre handler triggers after event (#1500) --- lib/server.js | 13 +++++-------- test/server.test.js | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/lib/server.js b/lib/server.js index a3d1c173f..081b815c1 100644 --- a/lib/server.js +++ b/lib/server.js @@ -753,17 +753,14 @@ Server.prototype._handle = function _handle(req, res) { // run pre() handlers first before routing and running if (self.before.length > 0) { self._run(req, res, null, self.before, function (err) { - // check for return false here - like with the regular handlers, - // if false is returned we already sent a response and should stop - // processing. - if (err === false) { - self._finishReqResCycle(req, res); + // Like with regular handlers, if we are provided an error, we + // should abort the middleware chain and fire after events. + if (err === false || err instanceof Error) { + self._finishReqResCycle(req, res, null, err); return; } - if (!err) { - routeAndRun(); - } + routeAndRun(); }); } else { routeAndRun(); diff --git a/test/server.test.js b/test/server.test.js index a8f8e9c57..9cb5b5bde 100644 --- a/test/server.test.js +++ b/test/server.test.js @@ -630,7 +630,6 @@ test('GH-64 prerouting chain with error', function (t) { }); }); - test('GH-67 extend access-control headers', function (t) { SERVER.get('/hello/:name', function tester(req, res, next) { res.header('Access-Control-Allow-Headers', @@ -2337,6 +2336,24 @@ test('calling next(false) should early exit from pre handlers', function (t) { }); +test('calling next(err) from pre should still emit after event', function (t) { + setTimeout(function () { + t.fail('Timed out'); + t.end(); + }, 2000); + var error = new Error(); + SERVER.pre(function (req, res, next) { + next(error); + }); + SERVER.get('/', function (req, res, next) { + t.fail('should have aborted stack before routing'); + }); + SERVER.on('after', function (req, res, route, err) { + t.equal(err, error); + t.end(); + }); + CLIENT.get('/', function () {}); +}); test('GH-1078: server name should default to restify', function (t) {