http: logically respect maxSockets
authorfengmk2 <fengmk2@gmail.com>
Mon, 23 Mar 2015 11:33:13 +0000 (19:33 +0800)
committerJeremiah Senkpiel <fishrock123@rocketmail.com>
Fri, 17 Apr 2015 16:20:44 +0000 (12:20 -0400)
Allows the number of pooled free sockets to equal maxSockets.
Previously it would only allow maxSockets - 1.

PR-URL: https://github.com/iojs/io.js/pull/1242
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Christian Tellnes <christian@tellnes.no>
lib/_http_agent.js
test/parallel/test-http-agent-maxsockets.js [new file with mode: 0644]

index c6bc829..02f5e04 100644 (file)
@@ -65,7 +65,7 @@ function Agent(options) {
         if (self.sockets[name])
           count += self.sockets[name].length;
 
-        if (count >= self.maxSockets || freeLen >= self.maxFreeSockets) {
+        if (count > self.maxSockets || freeLen >= self.maxFreeSockets) {
           self.removeSocket(socket, options);
           socket.destroy();
         } else {
diff --git a/test/parallel/test-http-agent-maxsockets.js b/test/parallel/test-http-agent-maxsockets.js
new file mode 100644 (file)
index 0000000..0f349ea
--- /dev/null
@@ -0,0 +1,53 @@
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+
+var agent = new http.Agent({
+  keepAlive: true,
+  keepAliveMsecs: 1000,
+  maxSockets: 2,
+  maxFreeSockets: 2
+});
+
+var server = http.createServer(function(req, res) {
+  res.end('hello world');
+});
+
+function get(path, callback) {
+  return http.get({
+    host: 'localhost',
+    port: common.PORT,
+    agent: agent,
+    path: path
+  }, callback);
+}
+
+var count = 0;
+function done() {
+  if (++count !== 2) {
+    return;
+  }
+  var freepool = agent.freeSockets[Object.keys(agent.freeSockets)[0]];
+  assert.equal(freepool.length, 2,
+      'expect keep 2 free sockets, but got ' + freepool.length);
+  agent.destroy();
+  server.close();
+}
+
+server.listen(common.PORT, function() {
+  get('/1', function(res) {
+    assert.equal(res.statusCode, 200);
+    res.resume();
+    res.on('end', function() {
+      process.nextTick(done);
+    });
+  });
+
+  get('/2', function(res) {
+    assert.equal(res.statusCode, 200);
+    res.resume();
+    res.on('end', function() {
+      process.nextTick(done);
+    });
+  });
+});