Skip to content

Commit

Permalink
HTTP: close connection on connection:close header.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
mikeal authored and ry committed Sep 22, 2010
1 parent dff1b5a commit cc1d61c
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 0 deletions.
4 changes: 4 additions & 0 deletions lib/http.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
49 changes: 49 additions & 0 deletions test/simple/test-http-keep-alive-close-on-header.js
Original file line number Diff line number Diff line change
@@ -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);
});

0 comments on commit cc1d61c

Please sign in to comment.