Skip to content

Commit

Permalink
http: change totalSocketCount only on socket creation/close
Browse files Browse the repository at this point in the history
  • Loading branch information
jodevsa committed Oct 23, 2021
1 parent ced518c commit aa0cced
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 2 deletions.
4 changes: 2 additions & 2 deletions lib/_http_agent.js
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,6 @@ Agent.prototype.addRequest = function addRequest(req, options, port/* legacy */,
this.reuseSocket(socket, req);
setRequestSocket(this, req, socket);
ArrayPrototypePush(this.sockets[name], socket);
this.totalSocketCount++;
} else if (sockLen < this.maxSockets &&
this.totalSocketCount < this.maxTotalSockets) {
debug('call onSocket', sockLen, freeLen);
Expand Down Expand Up @@ -383,6 +382,7 @@ function installListeners(agent, s, options) {
// This is the only place where sockets get removed from the Agent.
// If you want to remove a socket from the pool, just close it.
// All socket errors end in a close event anyway.
agent.totalSocketCount--;
agent.removeSocket(s, options);
}
s.on('close', onClose);
Expand All @@ -406,6 +406,7 @@ function installListeners(agent, s, options) {
// (defined by WebSockets) where we need to remove a socket from the
// pool because it'll be locked up indefinitely
debug('CLIENT socket onRemove');
agent.totalSocketCount--;
agent.removeSocket(s, options);
s.removeListener('close', onClose);
s.removeListener('free', onFree);
Expand Down Expand Up @@ -438,7 +439,6 @@ Agent.prototype.removeSocket = function removeSocket(s, options) {
// Don't leak
if (sockets[name].length === 0)
delete sockets[name];
this.totalSocketCount--;
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions test/parallel/test-http-agent-keepalive.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ function checkDataAndSockets(body) {
assert.strictEqual(body.toString(), 'hello world');
assert.strictEqual(agent.sockets[name].length, 1);
assert.strictEqual(agent.freeSockets[name], undefined);
assert.strictEqual(agent.totalSocketCount, 1);
}

function second() {
Expand All @@ -73,6 +74,7 @@ function second() {
process.nextTick(common.mustCall(() => {
assert.strictEqual(agent.sockets[name], undefined);
assert.strictEqual(agent.freeSockets[name].length, 1);
assert.strictEqual(agent.totalSocketCount, 1);
remoteClose();
}));
}));
Expand All @@ -91,10 +93,12 @@ function remoteClose() {
process.nextTick(common.mustCall(() => {
assert.strictEqual(agent.sockets[name], undefined);
assert.strictEqual(agent.freeSockets[name].length, 1);
assert.strictEqual(agent.totalSocketCount, 1);
// Waiting remote server close the socket
setTimeout(common.mustCall(() => {
assert.strictEqual(agent.sockets[name], undefined);
assert.strictEqual(agent.freeSockets[name], undefined);
assert.strictEqual(agent.totalSocketCount, 0);
remoteError();
}), common.platformTimeout(200));
}));
Expand All @@ -110,10 +114,12 @@ function remoteError() {
assert.strictEqual(err.message, 'socket hang up');
assert.strictEqual(agent.sockets[name].length, 1);
assert.strictEqual(agent.freeSockets[name], undefined);
assert.strictEqual(agent.totalSocketCount, 1);
// Wait socket 'close' event emit
setTimeout(common.mustCall(() => {
assert.strictEqual(agent.sockets[name], undefined);
assert.strictEqual(agent.freeSockets[name], undefined);
assert.strictEqual(agent.totalSocketCount, 0);
server.close();
}), common.platformTimeout(1));
}));
Expand All @@ -132,6 +138,7 @@ server.listen(0, common.mustCall(() => {
process.nextTick(common.mustCall(() => {
assert.strictEqual(agent.sockets[name], undefined);
assert.strictEqual(agent.freeSockets[name].length, 1);
assert.strictEqual(agent.totalSocketCount, 1);
second();
}));
}));
Expand Down
8 changes: 8 additions & 0 deletions test/parallel/test-http-upgrade-client.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,20 @@ server.listen(0, common.mustCall(function() {
const countdown = new Countdown(headers.length, () => server.close());

headers.forEach(function(h) {
const agent = new http.Agent();
const req = http.get({
agent,
port: port,
headers: h
});
let sawUpgrade = false;
req.on('socket', common.mustCall(function(){
assert.strictEqual(agent.totalSocketCount, 1);
}));

req.on('upgrade', common.mustCall(function(res, socket, upgradeHead) {
assert.strictEqual(agent.totalSocketCount, 0);

sawUpgrade = true;
let recvData = upgradeHead;
socket.on('data', function(d) {
Expand Down

0 comments on commit aa0cced

Please sign in to comment.