diff --git a/lib/_http_client.js b/lib/_http_client.js index 956dd8da7ab00f..e67d870aca794b 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -620,6 +620,10 @@ function responseOnEnd() { const res = this; const req = this.req; + if (req.socket && req.timeoutCb) { + req.socket.removeListener('timeout', emitRequestTimeout); + } + req._ended = true; if (!req.shouldKeepAlive || req.finished) responseKeepAlive(res, req); @@ -676,11 +680,17 @@ function tickOnSocket(req, socket) { req.emit('socket', socket); } +function emitRequestTimeout() { + const req = this._httpMessage; + if (req) { + req.emit('timeout'); + } +} + function listenSocketTimeout(req) { if (req.timeoutCb) { return; } - const emitRequestTimeout = () => req.emit('timeout'); // Set timeoutCb so it will get cleaned up on request end. req.timeoutCb = emitRequestTimeout; // Delegate socket timeout event. @@ -691,12 +701,6 @@ function listenSocketTimeout(req) { socket.once('timeout', emitRequestTimeout); }); } - // Remove socket timeout listener after response end. - req.once('response', (res) => { - res.once('end', () => { - req.socket.removeListener('timeout', emitRequestTimeout); - }); - }); } ClientRequest.prototype.onSocket = function onSocket(socket) {