Implement keep-alive for http.Client
authorMikeal Rogers <mikeal.rogers@gmail.com>
Mon, 2 Aug 2010 05:22:20 +0000 (22:22 -0700)
committerRyan Dahl <ry@tinyclouds.org>
Mon, 2 Aug 2010 05:34:17 +0000 (22:34 -0700)
Send the 'Connection: keep-alive' header in your request to enable.

doc/api.markdown
lib/http.js
test/simple/test-http-keep-alive.js [new file with mode: 0644]

index f4f450a..37a8e2d 100644 (file)
@@ -1911,6 +1911,16 @@ Example of connecting to `google.com`:
       });
     });
 
+There are a few special headers that should be noted.
+
+* The 'Host' header is not added by Node, and is usually required by
+  website.
+
+* Sending a 'Connection: keep-alive' will notify Node that the connection to
+  the server should be persisted until the next request.
+
+* Sending a 'Content-length' header will disable the default chunked encoding.
+
 
 ### Event: 'upgrade'
 
index 94c390f..ff54503 100644 (file)
@@ -374,7 +374,11 @@ OutgoingMessage.prototype._storeHeader = function (firstLine, headers) {
 
       if (connectionExpression.test(field)) {
         sentConnectionHeader = true;
-        if (closeExpression.test(value)) this._last = true;
+        if (closeExpression.test(value)) {
+          this._last = true;
+        } else {
+          this.shouldKeepAlive = true;
+        }
 
       } else if (transferEncodingExpression.test(field)) {
         sentTransferEncodingHeader = true;
@@ -855,7 +859,13 @@ function Client ( ) {
         // For the moment we reconnect for every request. FIXME!
         // All that should be required for keep-alive is to not reconnect,
         // but outgoingFlush instead.
-        self.end();
+        if (req.shouldKeepAlive) {
+          outgoingFlush(self)
+          self._outgoing.shift()
+          outgoingFlush(self)
+        } else {
+          self.end();
+        }
       });
 
       req.emit("response", res);
diff --git a/test/simple/test-http-keep-alive.js b/test/simple/test-http-keep-alive.js
new file mode 100644 (file)
index 0000000..edcb209
--- /dev/null
@@ -0,0 +1,49 @@
+common = require("../common");
+assert = common.assert
+
+assert = require("assert");
+http = require("http");
+sys = require("sys");
+
+body = "hello world\n";
+headers = {'connection':'keep-alive'}
+
+server = http.createServer(function (req, res) {
+  res.writeHead(200, {"Content-Length": body.length});
+  res.write(body);
+  res.end();
+});
+
+connectCount = 0;
+
+server.listen(common.PORT, function () {
+  var client = http.createClient(common.PORT);
+
+  client.addListener("connect", function () {
+    common.error("CONNECTED")
+    connectCount++;
+  })
+
+  var request = client.request("GET", "/", headers);
+  request.end();
+  request.addListener('response', function (response) {
+    common.error('response start');
+
+
+    response.addListener("end", function () {
+      common.error('response end');
+      var req = client.request("GET", "/", headers);
+      req.addListener('response', function (response) {
+        response.addListener("end", function () {
+          client.end();
+          server.close();
+        })
+      })
+      req.end();
+    });
+  });
+});
+
+process.addListener('exit', function () {
+  assert.equal(1, connectCount);
+});