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.
This commit is contained in:
parent
dff1b5ad10
commit
cc1d61cbb3
@ -858,6 +858,10 @@ function Client ( ) {
|
|||||||
// A major oversight in HTTP. Hence this nastiness.
|
// A major oversight in HTTP. Hence this nastiness.
|
||||||
var isHeadResponse = req.method == "HEAD";
|
var isHeadResponse = req.method == "HEAD";
|
||||||
debug('isHeadResponse ' + isHeadResponse);
|
debug('isHeadResponse ' + isHeadResponse);
|
||||||
|
|
||||||
|
if (req.shouldKeepAlive && res.headers.connection === 'close') {
|
||||||
|
req.shouldKeepAlive = false;
|
||||||
|
}
|
||||||
|
|
||||||
res.addListener('end', function ( ) {
|
res.addListener('end', function ( ) {
|
||||||
debug("request complete disconnecting. readyState = " + self.readyState);
|
debug("request complete disconnecting. readyState = " + self.readyState);
|
||||||
|
49
test/simple/test-http-keep-alive-close-on-header.js
Normal file
49
test/simple/test-http-keep-alive-close-on-header.js
Normal file
@ -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);
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user