mirror of
https://github.com/nodejs/node.git
synced 2025-04-30 15:41:06 +00:00

Previous location of setting the timeout would override behaviour of custom HttpAgents' keepSocketAlive. Moving it into the default keepSocketAlive allows it to interoperate with custom agents. Fixes: https://github.com/nodejs/node/issues/33111 PR-URL: https://github.com/nodejs/node/pull/33127 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Robert Nagy <ronagy@icloud.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com> Reviewed-By: Andrey Pechkurov <apechkurov@gmail.com>
135 lines
3.5 KiB
JavaScript
135 lines
3.5 KiB
JavaScript
'use strict';
|
|
|
|
const common = require('../common');
|
|
const assert = require('assert');
|
|
const http = require('http');
|
|
|
|
{
|
|
// Ensure reuse of successful sockets.
|
|
|
|
const agent = new http.Agent({ keepAlive: true });
|
|
|
|
const server = http.createServer((req, res) => {
|
|
res.end();
|
|
});
|
|
|
|
server.listen(0, common.mustCall(() => {
|
|
let socket;
|
|
http.get({ port: server.address().port, agent })
|
|
.on('response', common.mustCall((res) => {
|
|
socket = res.socket;
|
|
assert(socket);
|
|
res.resume();
|
|
socket.on('free', common.mustCall(() => {
|
|
http.get({ port: server.address().port, agent })
|
|
.on('response', common.mustCall((res) => {
|
|
assert.strictEqual(socket, res.socket);
|
|
assert(socket);
|
|
agent.destroy();
|
|
server.close();
|
|
}));
|
|
}));
|
|
}));
|
|
}));
|
|
}
|
|
|
|
{
|
|
// Ensure that timeouted sockets are not reused.
|
|
|
|
const agent = new http.Agent({ keepAlive: true, timeout: 50 });
|
|
|
|
const server = http.createServer((req, res) => {
|
|
res.end();
|
|
});
|
|
|
|
server.listen(0, common.mustCall(() => {
|
|
http.get({ port: server.address().port, agent })
|
|
.on('response', common.mustCall((res) => {
|
|
const socket = res.socket;
|
|
assert(socket);
|
|
res.resume();
|
|
socket.on('free', common.mustCall(() => {
|
|
socket.on('timeout', common.mustCall(() => {
|
|
http.get({ port: server.address().port, agent })
|
|
.on('response', common.mustCall((res) => {
|
|
assert.notStrictEqual(socket, res.socket);
|
|
assert.strictEqual(socket.destroyed, true);
|
|
agent.destroy();
|
|
server.close();
|
|
}));
|
|
}));
|
|
}));
|
|
}));
|
|
}));
|
|
}
|
|
|
|
{
|
|
// Ensure that destroyed sockets are not reused.
|
|
|
|
const agent = new http.Agent({ keepAlive: true });
|
|
|
|
const server = http.createServer((req, res) => {
|
|
res.end();
|
|
});
|
|
|
|
server.listen(0, common.mustCall(() => {
|
|
let socket;
|
|
http.get({ port: server.address().port, agent })
|
|
.on('response', common.mustCall((res) => {
|
|
socket = res.socket;
|
|
assert(socket);
|
|
res.resume();
|
|
socket.on('free', common.mustCall(() => {
|
|
socket.destroy();
|
|
http.get({ port: server.address().port, agent })
|
|
.on('response', common.mustCall((res) => {
|
|
assert.notStrictEqual(socket, res.socket);
|
|
assert(socket);
|
|
agent.destroy();
|
|
server.close();
|
|
}));
|
|
}));
|
|
}));
|
|
}));
|
|
}
|
|
|
|
{
|
|
// Ensure custom keepSocketAlive timeout is respected
|
|
|
|
const CUSTOM_TIMEOUT = 60;
|
|
const AGENT_TIMEOUT = 50;
|
|
|
|
class CustomAgent extends http.Agent {
|
|
keepSocketAlive(socket) {
|
|
if (!super.keepSocketAlive(socket)) {
|
|
return false;
|
|
}
|
|
|
|
socket.setTimeout(CUSTOM_TIMEOUT);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
const agent = new CustomAgent({ keepAlive: true, timeout: AGENT_TIMEOUT });
|
|
|
|
const server = http.createServer((req, res) => {
|
|
res.end();
|
|
});
|
|
|
|
server.listen(0, common.mustCall(() => {
|
|
http.get({ port: server.address().port, agent })
|
|
.on('response', common.mustCall((res) => {
|
|
const socket = res.socket;
|
|
assert(socket);
|
|
res.resume();
|
|
socket.on('free', common.mustCall(() => {
|
|
socket.on('timeout', common.mustCall(() => {
|
|
assert.strictEqual(socket.timeout, CUSTOM_TIMEOUT);
|
|
agent.destroy();
|
|
server.close();
|
|
}));
|
|
}));
|
|
}));
|
|
}));
|
|
}
|