diff --git a/lib/_http_agent.js b/lib/_http_agent.js index 6fbff37d85db26..5ed77033648e6a 100644 --- a/lib/_http_agent.js +++ b/lib/_http_agent.js @@ -78,13 +78,15 @@ function Agent(options) { req.shouldKeepAlive && !socket.destroyed && self.options.keepAlive) { + var freeSockets = self.freeSockets[name]; - var freeLen = freeSockets ? freeSockets.length : 0; - var count = freeLen; + var totalSocketLength = freeSockets ? freeSockets.length : 0; + var socketsAvailable = totalSocketLength < this.maxSockets || totalSocketLength >= self.maxFreeSockets; + if (self.sockets[name]) - count += self.sockets[name].length; + totalSocketLength += self.sockets[name].length; - if (count >= self.maxSockets || freeLen >= self.maxFreeSockets) { + if (socketsAvailable) { self.removeSocket(socket, options); socket.destroy(); } else { @@ -145,28 +147,29 @@ Agent.prototype.addRequest = function(req, options) { this.sockets[name] = []; } - var freeLen = this.freeSockets[name] ? this.freeSockets[name].length : 0; - var sockLen = freeLen + this.sockets[name].length; + var availableFreeSockets = this.freeSockets[name] ? this.freeSockets[name].length : 0; + var totalSocketLength = availableFreeSockets + this.sockets[name].length; + var socketsAvailable = totalSocketLength < this.maxSockets; - if (freeLen) { + if (availableFreeSockets) { // we have a free socket, so use that. var socket = this.freeSockets[name].shift(); debug('have free socket'); + var hasFreeSockets = !this.freeSockets[name].length + // don't leak - if (!this.freeSockets[name].length) + if (hasFreeSockets) delete this.freeSockets[name]; socket.ref(); req.onSocket(socket); this.sockets[name].push(socket); - } else if (sockLen < this.maxSockets) { - debug('call onSocket', sockLen, freeLen); - // If we are under maxSockets create a new one. + } else if (socketsAvailable) { + debug('call onSocket', totalSocketLength, availableFreeSockets); req.onSocket(this.createSocket(req, options)); } else { debug('wait for socket'); - // We are over limit so we'll add it to the queue. if (!this.requests[name]) { this.requests[name] = []; }