Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Implement keep-alive for http.Client

Send the 'Connection: keep-alive' header in your request to enable.
  • Loading branch information...
commit 3214116be6bd088a02d0447f57b0ba15038adce0 1 parent 71009ad
@mikeal mikeal authored ry committed
View
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'
View
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!
@ncr
ncr added a note

Looks like this comment is no longer needed :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
// 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);
View
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);
+});

0 comments on commit 3214116

Please sign in to comment.
Something went wrong with that request. Please try again.