http.globalAgent.maxSockets is not always respected

Aborting a pending request (whose response is not read yet) causes http.globalAgent.maxSockets to not being respected for future requests.

Specifically:

  • the response must contain some data;
  • there must be a 'response' listener registered for the requests.

I can reproduce the issue with the following:

client.js:

var http = require('http');

http.globalAgent.maxSockets = 3;

for (var i = 0; i < 100; i++) {
    var request = http.get('http://127.0.0.1:8080', function () {
        // just register a listener...
    });
    request.setTimeout(1000, function () {
        console.log('T');
        this.abort();
    });
}

server.js:

require('http').createServer(function (reqest, response) {
    console.log('R');
    response.end('hello');
}).listen(8080);

Run server.js then client.js; the output of the former is:

R
R
R
# 1s timeout here...
R
R
R
R
R
R
# 1s timeout here...
R
R
R
R
R
R
R
R
R
R
R
R
# 1s timeout here...
[...]
# up to 100

I was expecting groups of three requests each, instead of: 100 = 3 + 6 + 12 + 24 + 48 + 7.
The output of client.js reflects the one of server.js.

This happen at least with v4.1.1 and v5.1.0.


I apologize if the above is the intended behavior and I'm just misunderstanding request.abort() and agent.maxSockets.