From cc1d61cbb3a9b2b75edac66295f2bc5314be5042 Mon Sep 17 00:00:00 2001 From: Mikeal Rogers Date: Wed, 22 Sep 2010 10:16:18 -0700 Subject: [PATCH] HTTP: close connection on connection:close header. rnewson found a good bug in keep-alive. we were only using the request headers we send to enable/disable keep-alive but when the server sends Connection: close we need to close down the connection regardless. I wrote up a patch the Robert verified makes all his test client code work now and I also added a new unittest for it. --- lib/http.js | 4 ++ .../test-http-keep-alive-close-on-header.js | 49 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 test/simple/test-http-keep-alive-close-on-header.js diff --git a/lib/http.js b/lib/http.js index aa922ef472..45a71c9b51 100644 --- a/lib/http.js +++ b/lib/http.js @@ -858,6 +858,10 @@ function Client ( ) { // A major oversight in HTTP. Hence this nastiness. var isHeadResponse = req.method == "HEAD"; debug('isHeadResponse ' + isHeadResponse); + + if (req.shouldKeepAlive && res.headers.connection === 'close') { + req.shouldKeepAlive = false; + } res.addListener('end', function ( ) { debug("request complete disconnecting. readyState = " + self.readyState); diff --git a/test/simple/test-http-keep-alive-close-on-header.js b/test/simple/test-http-keep-alive-close-on-header.js new file mode 100644 index 0000000000..995b7a8452 --- /dev/null +++ b/test/simple/test-http-keep-alive-close-on-header.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, "Connection":"close"}); + 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(2, connectCount); +});