mirror of
https://github.com/nodejs/node.git
synced 2025-05-03 03:56:02 +00:00

When request with both timeout and agent, timeout not work. This patch will fix it, socket timeout will set to request timeout before socket is connected, and socket timeout will reset to agent timeout after response end. Fixes: https://github.com/nodejs/node/issues/21185 PR-URL: https://github.com/nodejs/node/pull/21204 Reviewed-By: Khaidi Chu <i@2333.moe> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ujjwal Sharma <usharma1998@gmail.com>
56 lines
1.4 KiB
JavaScript
56 lines
1.4 KiB
JavaScript
'use strict';
|
|
const common = require('../common');
|
|
|
|
// Test that when http request uses both timeout and agent,
|
|
// timeout will work as expected.
|
|
|
|
const assert = require('assert');
|
|
const http = require('http');
|
|
|
|
const HTTP_AGENT_TIMEOUT = 1000;
|
|
const HTTP_CLIENT_TIMEOUT = 3000;
|
|
|
|
const agent = new http.Agent({ timeout: HTTP_AGENT_TIMEOUT });
|
|
const options = {
|
|
method: 'GET',
|
|
port: undefined,
|
|
host: '127.0.0.1',
|
|
path: '/',
|
|
timeout: HTTP_CLIENT_TIMEOUT,
|
|
agent,
|
|
};
|
|
|
|
const server = http.createServer(() => {
|
|
// Never respond.
|
|
});
|
|
|
|
server.listen(0, options.host, function() {
|
|
doRequest();
|
|
});
|
|
|
|
function doRequest() {
|
|
options.port = server.address().port;
|
|
const req = http.request(options);
|
|
const start = Date.now();
|
|
req.on('error', () => {
|
|
// This space is intentionally left blank.
|
|
});
|
|
req.on('close', common.mustCall(() => server.close()));
|
|
|
|
let timeout_events = 0;
|
|
req.on('timeout', common.mustCall(() => {
|
|
timeout_events += 1;
|
|
const duration = Date.now() - start;
|
|
// The timeout event cannot be precisely timed. It will delay
|
|
// some number of milliseconds, so test it in second units.
|
|
assert.strictEqual(duration / 1000 | 0, HTTP_CLIENT_TIMEOUT / 1000);
|
|
}));
|
|
req.end();
|
|
|
|
setTimeout(function() {
|
|
req.destroy();
|
|
assert.strictEqual(timeout_events, 1);
|
|
// Ensure the `timeout` event fired only once.
|
|
}, common.platformTimeout(HTTP_CLIENT_TIMEOUT * 2));
|
|
}
|