Skip to content

Commit

Permalink
net: reduce likelihood of race conditions on keep-alive timeout calcu…
Browse files Browse the repository at this point in the history
…lation between http1.1 servers and clients

reduced likelihood of race conditions on keep-alive timeout calculation between http1.1 servers and clients and honor server keep-alive timeout when agentTimeout is not set

Fixes: nodejs#47130
Fixes: nodejs#52649
  • Loading branch information
zanettea authored and Zanette Arrigo committed Apr 24, 2024
1 parent e617573 commit 2bc8212
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions lib/_http_agent.js
Expand Up @@ -488,6 +488,7 @@ Agent.prototype.keepSocketAlive = function keepSocketAlive(socket) {
socket.unref();

let agentTimeout = this.options.timeout || 0;
let canKeepSocketAlive = true;

if (socket._httpMessage?.res) {
const keepAliveHint = socket._httpMessage.res.headers['keep-alive'];
Expand All @@ -498,10 +499,12 @@ Agent.prototype.keepSocketAlive = function keepSocketAlive(socket) {
if (hint) {
// Let the timer expires before the announced timeout to reduce
// the likelihood of ECONNRESET errors
let serverHintTimeout = ( NumberParseInt(hint) * 1000 ) - 1000;
let serverHintTimeout = (NumberParseInt(hint) * 1000) - 1000;
serverHintTimeout = serverHintTimeout > 0 ? serverHintTimeout : 0;

if (serverHintTimeout < agentTimeout) {
if (serverHintTimeout === 0) {
// Cannot safely reuse the socket because the server timeout is too short
canKeepSocketAlive = false;
} else if (!agentTimeout || serverHintTimeout < agentTimeout) {
agentTimeout = serverHintTimeout;
}
}
Expand All @@ -512,7 +515,7 @@ Agent.prototype.keepSocketAlive = function keepSocketAlive(socket) {
socket.setTimeout(agentTimeout);
}

return true;
return canKeepSocketAlive;
};

Agent.prototype.reuseSocket = function reuseSocket(socket, req) {
Expand Down

0 comments on commit 2bc8212

Please sign in to comment.