diff --git a/lib/_http_client.js b/lib/_http_client.js index a70f4de918b08e..a5cfdcba585a4a 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -727,6 +727,10 @@ function _deferToConnect(method, arguments_, cb) { } ClientRequest.prototype.setTimeout = function setTimeout(msecs, callback) { + if (this._ended) { + return this; + } + listenSocketTimeout(this); msecs = validateTimerDuration(msecs); if (callback) this.once('timeout', callback); diff --git a/test/parallel/test-http-client-set-timeout-after-end.js b/test/parallel/test-http-client-set-timeout-after-end.js new file mode 100644 index 00000000000000..99bbf3dd1bc766 --- /dev/null +++ b/test/parallel/test-http-client-set-timeout-after-end.js @@ -0,0 +1,33 @@ +'use strict'; + +// Test https://github.com/nodejs/node/issues/25499 fix. + +const { mustCall } = require('../common'); + +const { Agent, createServer, get } = require('http'); +const { strictEqual } = require('assert'); + +const server = createServer(mustCall((req, res) => { + res.end(); +})); + +server.listen(0, () => { + const agent = new Agent({ keepAlive: true, maxSockets: 1 }); + const port = server.address().port; + + let socket; + + const req = get({ agent, port }, (res) => { + res.on('end', () => { + strictEqual(req.setTimeout(0), req); + strictEqual(socket.listenerCount('timeout'), 0); + agent.destroy(); + server.close(); + }); + res.resume(); + }); + + req.on('socket', (sock) => { + socket = sock; + }); +});