From 3214116be6bd088a02d0447f57b0ba15038adce0 Mon Sep 17 00:00:00 2001 From: Mikeal Rogers Date: Sun, 1 Aug 2010 22:22:20 -0700 Subject: [PATCH] Implement keep-alive for http.Client Send the 'Connection: keep-alive' header in your request to enable. --- doc/api.markdown | 10 ++++++++ lib/http.js | 14 +++++++++-- test/simple/test-http-keep-alive.js | 49 +++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 test/simple/test-http-keep-alive.js diff --git a/doc/api.markdown b/doc/api.markdown index f4f450a..37a8e2d 100644 --- a/doc/api.markdown +++ b/doc/api.markdown @@ -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' diff --git a/lib/http.js b/lib/http.js index 94c390f..ff54503 100644 --- a/lib/http.js +++ b/lib/http.js @@ -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 index 0000000..edcb209 --- /dev/null +++ b/test/simple/test-http-keep-alive.js @@ -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); +}); -- 2.7.4