Skip to content

Commit 7b26322

Browse files
bnoordhuisjuanarbol
authored andcommitted
http: make response.setTimeout() work
Fixes: #33734 PR-URL: #34913 Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: Ricky Zhou <[email protected]> Reviewed-By: Trivikram Kamat <[email protected]>
1 parent 2178227 commit 7b26322

File tree

3 files changed

+31
-7
lines changed

3 files changed

+31
-7
lines changed

lib/_http_client.js

+15-5
Original file line numberDiff line numberDiff line change
@@ -534,8 +534,8 @@ function socketOnData(d) {
534534
socket.removeListener('end', socketOnEnd);
535535
socket.removeListener('drain', ondrain);
536536

537-
if (req.timeoutCb)
538-
socket.removeListener('timeout', req.timeoutCb);
537+
if (req.timeoutCb) socket.removeListener('timeout', req.timeoutCb);
538+
socket.removeListener('timeout', responseOnTimeout);
539539

540540
parser.finish();
541541
freeParser(parser, req, socket);
@@ -645,6 +645,7 @@ function parserOnIncomingClient(res, shouldKeepAlive) {
645645
// Add our listener first, so that we guarantee socket cleanup
646646
res.on('end', responseOnEnd);
647647
req.on('prefinish', requestOnPrefinish);
648+
socket.on('timeout', responseOnTimeout);
648649

649650
// If the user did not listen for the 'response' event, then they
650651
// can't possibly read the data, so we ._dump() it into the void
@@ -698,15 +699,16 @@ function responseKeepAlive(req) {
698699

699700
function responseOnEnd() {
700701
const req = this.req;
702+
const socket = req.socket;
701703

702-
if (req.socket && req.timeoutCb) {
703-
req.socket.removeListener('timeout', emitRequestTimeout);
704+
if (socket) {
705+
if (req.timeoutCb) socket.removeListener('timeout', emitRequestTimeout);
706+
socket.removeListener('timeout', responseOnTimeout);
704707
}
705708

706709
req._ended = true;
707710

708711
if (!req.shouldKeepAlive) {
709-
const socket = req.socket;
710712
if (socket.writable) {
711713
debug('AGENT socket.destroySoon()');
712714
if (typeof socket.destroySoon === 'function')
@@ -725,6 +727,14 @@ function responseOnEnd() {
725727
}
726728
}
727729

730+
function responseOnTimeout() {
731+
const req = this._httpMessage;
732+
if (!req) return;
733+
const res = req.res;
734+
if (!res) return;
735+
res.emit('timeout');
736+
}
737+
728738
function requestOnPrefinish() {
729739
const req = this;
730740

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
'use strict';
2+
const common = require('../common');
3+
const http = require('http');
4+
5+
const server = http.createServer((req, res) => res.flushHeaders());
6+
7+
server.listen(common.mustCall(() => {
8+
const req =
9+
http.get({ port: server.address().port }, common.mustCall((res) => {
10+
res.on('timeout', common.mustCall(() => req.destroy()));
11+
res.setTimeout(1);
12+
server.close();
13+
}));
14+
}));

test/parallel/test-http-client-timeout-option-listeners.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ const options = {
2424
server.listen(0, options.host, common.mustCall(() => {
2525
options.port = server.address().port;
2626
doRequest(common.mustCall((numListeners) => {
27-
assert.strictEqual(numListeners, 2);
27+
assert.strictEqual(numListeners, 3);
2828
doRequest(common.mustCall((numListeners) => {
29-
assert.strictEqual(numListeners, 2);
29+
assert.strictEqual(numListeners, 3);
3030
server.close();
3131
agent.destroy();
3232
}));

0 commit comments

Comments
 (0)