summaryrefslogtreecommitdiff
path: root/lib/_http_agent.js
diff options
context:
space:
mode:
authorRobert Nagy <ronagy@icloud.com>2020-04-12 22:40:58 +0200
committerAnna Henningsen <anna@addaleax.net>2020-04-15 02:13:51 +0200
commit613d4217e8a108cdced45c63ca2efa07b56e71ca (patch)
treed619d372affd7a1a4657252a72ea29581c41525d /lib/_http_agent.js
parente0a7fd7d214300496a3b63eec74296661d844a2d (diff)
downloadnode-new-613d4217e8a108cdced45c63ca2efa07b56e71ca.tar.gz
http: refactor agent 'free' handler
Remove nesting in favor of early returns. PR-URL: https://github.com/nodejs/node/pull/32801 Reviewed-By: Zeyu Yang <himself65@outlook.com> Reviewed-By: Denys Otrishko <shishugi@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net>
Diffstat (limited to 'lib/_http_agent.js')
-rw-r--r--lib/_http_agent.js97
1 files changed, 49 insertions, 48 deletions
diff --git a/lib/_http_agent.js b/lib/_http_agent.js
index 66e8632c9d..2618c6c3cb 100644
--- a/lib/_http_agent.js
+++ b/lib/_http_agent.js
@@ -37,6 +37,8 @@ const {
ERR_INVALID_ARG_TYPE,
},
} = require('internal/errors');
+const { once } = require('internal/util');
+
const kOnKeylog = Symbol('onkeylog');
// New Agent code.
@@ -94,52 +96,55 @@ function Agent(options) {
// case of socket.destroy() below this 'error' has no handler
// and could cause unhandled exception.
- if (socket.writable &&
- this.requests[name] && this.requests[name].length) {
- const req = this.requests[name].shift();
+ if (!socket.writable) {
+ socket.destroy();
+ return;
+ }
+
+ const requests = this.requests[name];
+ if (requests && requests.length) {
+ const req = requests.shift();
setRequestSocket(this, req, socket);
- if (this.requests[name].length === 0) {
- // don't leak
+ if (requests.length === 0) {
delete this.requests[name];
}
- } else {
- // If there are no pending requests, then put it in
- // the freeSockets pool, but only if we're allowed to do so.
- const req = socket._httpMessage;
- if (req &&
- req.shouldKeepAlive &&
- socket.writable &&
- this.keepAlive) {
- let freeSockets = this.freeSockets[name];
- const freeLen = freeSockets ? freeSockets.length : 0;
- let count = freeLen;
- if (this.sockets[name])
- count += this.sockets[name].length;
-
- if (count > this.maxSockets || freeLen >= this.maxFreeSockets) {
- socket.destroy();
- } else if (this.keepSocketAlive(socket)) {
- freeSockets = freeSockets || [];
- this.freeSockets[name] = freeSockets;
- socket[async_id_symbol] = -1;
- socket._httpMessage = null;
- this.removeSocket(socket, options);
-
- const agentTimeout = this.options.timeout || 0;
- if (socket.timeout !== agentTimeout) {
- socket.setTimeout(agentTimeout);
- }
-
- socket.once('error', freeSocketErrorListener);
- freeSockets.push(socket);
- } else {
- // Implementation doesn't want to keep socket alive
- socket.destroy();
- }
- } else {
- socket.destroy();
- }
+ return;
+ }
+
+ // If there are no pending requests, then put it in
+ // the freeSockets pool, but only if we're allowed to do so.
+ const req = socket._httpMessage;
+ if (!req || !req.shouldKeepAlive || !this.keepAlive) {
+ socket.destroy();
+ return;
}
+
+ let freeSockets = this.freeSockets[name];
+ const freeLen = freeSockets ? freeSockets.length : 0;
+ let count = freeLen;
+ if (this.sockets[name])
+ count += this.sockets[name].length;
+
+ if (count > this.maxSockets ||
+ freeLen >= this.maxFreeSockets ||
+ !this.keepSocketAlive(socket)) {
+ socket.destroy();
+ return;
+ }
+
+ freeSockets = freeSockets || [];
+ this.freeSockets[name] = freeSockets;
+ socket[async_id_symbol] = -1;
+ socket._httpMessage = null;
+ this.removeSocket(socket, options);
+
+ const agentTimeout = this.options.timeout || 0;
+ if (socket.timeout !== agentTimeout) {
+ socket.setTimeout(agentTimeout);
+ }
+
+ socket.once('error', freeSocketErrorListener);
+ freeSockets.push(socket);
});
// Don't emit keylog events unless there is a listener for them.
@@ -266,12 +271,8 @@ Agent.prototype.createSocket = function createSocket(req, options, cb) {
debug('createConnection', name, options);
options.encoding = null;
- let called = false;
- const oncreate = (err, s) => {
- if (called)
- return;
- called = true;
+ const oncreate = once((err, s) => {
if (err)
return cb(err);
if (!this.sockets[name]) {
@@ -281,7 +282,7 @@ Agent.prototype.createSocket = function createSocket(req, options, cb) {
debug('sockets', name, this.sockets[name].length);
installListeners(this, s, options);
cb(null, s);
- };
+ });
const newSocket = this.createConnection(options, oncreate);
if (newSocket)