From 4b6e4c1eb110e0be671ec5972bf280d2bf3892d8 Mon Sep 17 00:00:00 2001 From: Luigi Pinca Date: Mon, 14 Jan 2019 09:14:13 +0100 Subject: [PATCH] http: make timeout event work with agent timeout The `'timeout'` event is currently not emitted on the `ClientRequest` instance when the socket timeout expires if only the `timeout` option of the agent is set. This happens because, under these circumstances, `listenSocketTimeout()` is not called. This commit fixes the issue by calling it also when only the agent `timeout` option is set. PR-URL: https://github.com/nodejs/node/pull/25488 Reviewed-By: Anna Henningsen Reviewed-By: James M Snell --- lib/_http_client.js | 5 +++- .../test-http-agent-timeout-option.js | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-http-agent-timeout-option.js diff --git a/lib/_http_client.js b/lib/_http_client.js index 943441f1a1db33..1ccb289b24791a 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -653,7 +653,10 @@ function tickOnSocket(req, socket) { socket.on('end', socketOnEnd); socket.on('close', socketCloseListener); - if (req.timeout !== undefined) { + if ( + req.timeout !== undefined || + (req.agent && req.agent.options && req.agent.options.timeout) + ) { listenSocketTimeout(req); } req.emit('socket', socket); diff --git a/test/parallel/test-http-agent-timeout-option.js b/test/parallel/test-http-agent-timeout-option.js new file mode 100644 index 00000000000000..4fcfc1f1da54b1 --- /dev/null +++ b/test/parallel/test-http-agent-timeout-option.js @@ -0,0 +1,23 @@ +'use strict'; + +const { expectsError, mustCall } = require('../common'); +const { Agent, get } = require('http'); + +// Test that the `'timeout'` event is emitted on the `ClientRequest` instance +// when the socket timeout set via the `timeout` option of the `Agent` expires. + +const request = get({ + agent: new Agent({ timeout: 500 }), + // Non-routable IP address to prevent the connection from being established. + host: '192.0.2.1' +}); + +request.on('error', expectsError({ + type: Error, + code: 'ECONNRESET', + message: 'socket hang up' +})); + +request.on('timeout', mustCall(() => { + request.abort(); +}));