Skip to content

Commit 4bb798f

Browse files
authored
fix: onRequestAbort hook request pending (fastify#4611)
1 parent 5910742 commit 4bb798f

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

docs/Reference/Hooks.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ fastify.addHook('onRequestAbort', async (request, reply) => {
284284
})
285285
```
286286
The `onRequestAbort` hook is executed when a client closes the connection before
287-
the entire request has been received. Therefore, you will not be able to send
287+
the entire request has been processed. Therefore, you will not be able to send
288288
data to the client.
289289

290290
**Notice:** client abort detection is not completely reliable. See: [`Detecting-When-Clients-Abort.md`](../Guides/Detecting-When-Clients-Abort.md)

lib/route.js

+1
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,7 @@ function handleOnRequestAbortHooksErrors (reply, err) {
513513
if (err) {
514514
reply.log.error({ err }, 'onRequestAborted hook failed')
515515
}
516+
reply[kReplyIsError] = true
516517
}
517518

518519
function handleTimeout () {

test/hooks.test.js

+25-2
Original file line numberDiff line numberDiff line change
@@ -3413,19 +3413,42 @@ test('onRequestAbort should be triggered', t => {
34133413
const fastify = Fastify()
34143414
let order = 0
34153415

3416-
t.plan(3)
3416+
t.plan(9)
34173417
t.teardown(() => fastify.close())
34183418

34193419
fastify.addHook('onRequestAbort', function (req, done) {
34203420
t.equal(++order, 1, 'called in hook')
3421+
t.ok(req.pendingResolve, 'request has pendingResolve')
3422+
req.pendingResolve()
3423+
done()
3424+
})
3425+
3426+
fastify.addHook('onError', function hook (request, reply, error, done) {
3427+
t.same(error, { hello: 'world' }, 'onError should be called')
3428+
t.ok(request.raw.aborted, 'request should be aborted')
3429+
done()
3430+
})
3431+
3432+
fastify.addHook('onSend', function hook (request, reply, payload, done) {
3433+
t.equal(payload, '{"hello":"world"}', 'onSend should be called')
3434+
done(null, payload)
3435+
})
3436+
3437+
fastify.addHook('onResponse', function hook (request, reply, done) {
3438+
t.fail('onResponse should not be called')
34213439
done()
34223440
})
34233441

34243442
fastify.route({
34253443
method: 'GET',
34263444
path: '/',
34273445
async handler (request, reply) {
3428-
await sleep(1000)
3446+
t.pass('handler called')
3447+
let resolvePromise
3448+
const promise = new Promise(resolve => { resolvePromise = resolve })
3449+
request.pendingResolve = resolvePromise
3450+
await promise
3451+
t.pass('handler promise resolved')
34293452
return { hello: 'world' }
34303453
},
34313454
async onRequestAbort (req) {

0 commit comments

Comments
 (0)