Skip to content

Commit e51df14

Browse files
authored
fix(nodejs#3975): do not unref timeout (nodejs#3977)
1 parent ad7ac02 commit e51df14

File tree

3 files changed

+48
-1
lines changed

3 files changed

+48
-1
lines changed

lib/handler/retry-handler.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ class RetryHandler {
133133
? Math.min(retryAfterHeader, maxTimeout)
134134
: Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout)
135135

136-
setTimeout(() => cb(null), retryTimeout).unref()
136+
setTimeout(() => cb(null), retryTimeout)
137137
}
138138

139139
onResponseStart (controller, statusCode, headers, statusMessage) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
'use strict'
2+
3+
const { createServer } = require('node:http')
4+
const { once } = require('node:events')
5+
const {
6+
Client,
7+
interceptors: { retry }
8+
} = require('../../..')
9+
10+
const server = createServer()
11+
12+
server.on('request', (req, res) => {
13+
res.writeHead(418, { 'Content-Type': 'text/plain' })
14+
res.end('teapot')
15+
})
16+
17+
server.listen(0)
18+
once(server, 'listening').then(() => {
19+
const client = new Client(
20+
`http://localhost:${server.address().port}`
21+
).compose(
22+
retry({
23+
maxTimeout: 1000,
24+
maxRetries: 3,
25+
statusCodes: [418]
26+
})
27+
)
28+
29+
return client.request({
30+
method: 'GET',
31+
path: '/'
32+
})
33+
})

test/interceptors/retry.js

+14
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const { tspl } = require('@matteo.collina/tspl')
44
const { test, after } = require('node:test')
55
const { createServer } = require('node:http')
66
const { once } = require('node:events')
7+
const { spawnSync } = require('node:child_process')
78

89
const { Client, interceptors } = require('../..')
910
const { retry, redirect, dns } = interceptors
@@ -559,3 +560,16 @@ test('should not error if request is not meant to be retried', async t => {
559560
t.equal(response.statusCode, 400)
560561
t.equal(await response.body.text(), 'Bad request')
561562
})
563+
564+
test('#3975 - keep event loop ticking', async t => {
565+
const suite = tspl(t, { plan: 3 })
566+
567+
const res = spawnSync('node', ['./test/fixtures/interceptors/retry-event-loop.js'], {
568+
stdio: 'pipe'
569+
})
570+
571+
const output = res.stderr.toString()
572+
suite.ok(output.includes("code: 'UND_ERR_REQ_RETRY'"))
573+
suite.ok(output.includes('RequestRetryError: Request failed'))
574+
suite.ok(output.includes('statusCode: 418'))
575+
})

0 commit comments

Comments
 (0)