Browse Source

Implement keep-alive for http.Client

Send the 'Connection: keep-alive' header in your request to enable.
v0.7.4-release
Mikeal Rogers 15 years ago
committed by Ryan Dahl
parent
commit
3214116be6
  1. 10
      doc/api.markdown
  2. 12
      lib/http.js
  3. 49
      test/simple/test-http-keep-alive.js

10
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' ### Event: 'upgrade'

12
lib/http.js

@ -374,7 +374,11 @@ OutgoingMessage.prototype._storeHeader = function (firstLine, headers) {
if (connectionExpression.test(field)) { if (connectionExpression.test(field)) {
sentConnectionHeader = true; 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)) { } else if (transferEncodingExpression.test(field)) {
sentTransferEncodingHeader = true; sentTransferEncodingHeader = true;
@ -855,7 +859,13 @@ function Client ( ) {
// For the moment we reconnect for every request. FIXME! // For the moment we reconnect for every request. FIXME!
// All that should be required for keep-alive is to not reconnect, // All that should be required for keep-alive is to not reconnect,
// but outgoingFlush instead. // but outgoingFlush instead.
if (req.shouldKeepAlive) {
outgoingFlush(self)
self._outgoing.shift()
outgoingFlush(self)
} else {
self.end(); self.end();
}
}); });
req.emit("response", res); req.emit("response", res);

49
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);
});
Loading…
Cancel
Save