Fix regression routing a large stack in a single route

fixes #4913
This commit is contained in:
Douglas Christopher Wilson
2022-05-20 09:37:20 -04:00
parent ab2c70b954
commit 7ec5dd2b3c
3 changed files with 23 additions and 9 deletions

View File

@@ -1,3 +1,8 @@
unreleased
==========
* Fix regression routing a large stack in a single route
4.18.1 / 2022-04-29
===================

View File

@@ -124,21 +124,21 @@ Route.prototype.dispatch = function dispatch(req, res, done) {
return done(err)
}
var layer = stack[idx++];
if (!layer) {
return done(err);
}
// max sync stack
if (++sync > 100) {
return setImmediate(next, err)
}
if (layer.method && layer.method !== method) {
return next(err);
var layer = stack[idx++]
// end of layers
if (!layer) {
return done(err)
}
if (err) {
if (layer.method && layer.method !== method) {
next(err)
} else if (err) {
layer.handle_error(err, req, res, next);
} else {
layer.handle_request(req, res, next);

View File

@@ -19,8 +19,16 @@ describe('Route', function(){
var req = { method: 'GET', url: '/' }
var route = new Route('/foo')
route.get(function (req, res, next) {
req.counter = 0
next()
})
for (var i = 0; i < 6000; i++) {
route.all(function (req, res, next) { next() })
route.all(function (req, res, next) {
req.counter++
next()
})
}
route.get(function (req, res, next) {
@@ -31,6 +39,7 @@ describe('Route', function(){
route.dispatch(req, {}, function (err) {
if (err) return done(err)
assert.ok(req.called)
assert.strictEqual(req.counter, 6000)
done()
})
})