mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
Implement keep-alive for http.Client
Send the 'Connection: keep-alive' header in your request to enable.
This commit is contained in:
@@ -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'
|
||||
|
||||
|
||||
14
lib/http.js
14
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);
|
||||
|
||||
49
test/simple/test-http-keep-alive.js
Normal file
49
test/simple/test-http-keep-alive.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});
|
||||
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);
|
||||
});
|
||||
Reference in New Issue
Block a user