http: ServerRequest does not timeout after 'end'
authorkoichik <koichik@improvement.jp>
Sun, 10 Mar 2013 11:10:19 +0000 (20:10 +0900)
committerkoichik <koichik@improvement.jp>
Sun, 10 Mar 2013 11:14:43 +0000 (20:14 +0900)
Fixes #4967

lib/http.js
test/simple/test-http-server-timeout-pipeline.js [deleted file]
test/simple/test-http-set-timeout-server.js

index 2f4bcc51e2323b4b4b3a2a5e83c536c1168dbe56..0f7ea853c0452db5846c70bda9522b3f0fa4f9e9 100644 (file)
@@ -1873,7 +1873,7 @@ function connectionListener(socket) {
     socket.setTimeout(self.timeout);
   socket.on('timeout', function() {
     var req = socket.parser && socket.parser.incoming;
-    var reqTimeout = req && req.emit('timeout', socket);
+    var reqTimeout = req && !req.complete && req.emit('timeout', socket);
     var res = socket._httpMessage;
     var resTimeout = res && res.emit('timeout', socket);
     var serverTimeout = self.emit('timeout', socket);
diff --git a/test/simple/test-http-server-timeout-pipeline.js b/test/simple/test-http-server-timeout-pipeline.js
deleted file mode 100644 (file)
index 0e4d41e..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var common = require('../common');
-var assert = require('assert');
-
-var http = require('http');
-var net = require('net');
-
-var server = http.createServer(function(req, res) {
-  console.log('get', req.url);
-  res.setTimeout(100, function() {
-    console.log('timeout on response', req.url);
-  });
-  req.on('end', function() {
-    console.log('end', req.url);
-  });
-}).listen(3000, function() {
-  var c = net.connect(3000, function() {
-    c.write('GET /1 HTTP/1.1\r\n' +
-      'Host: localhost\r\n\r\n');
-    c.write('GET /2 HTTP/1.1\r\n' +
-      'Host: localhost\r\n\r\n');
-  });
-});
-server.setTimeout(200, function(socket) {
-  console.log('timeout on server');
-  socket.destroy();
-  server.close();
-});
index 21be505b704970084e5b477e6020c5f66b3a0840..ff4144963afcdafc7b3c94a04e586034fc2066c4 100644 (file)
@@ -22,6 +22,7 @@
 var common = require('../common.js');
 var assert = require('assert');
 var http = require('http');
+var net = require('net');
 
 var tests = [];
 
@@ -73,7 +74,10 @@ test(function serverRequestTimeout(cb) {
     });
   });
   server.listen(common.PORT);
-  http.get({ port: common.PORT }).on('error', function() {});
+  var req = http.request({ port: common.PORT, method: 'POST' });
+  req.on('error', function() {});
+  req.write('Hello');
+  // req is in progress
 });
 
 test(function serverResponseTimeout(cb) {
@@ -93,3 +97,83 @@ test(function serverResponseTimeout(cb) {
   server.listen(common.PORT);
   http.get({ port: common.PORT }).on('error', function() {});
 });
+
+test(function serverRequestNotTimeoutAfterEnd(cb) {
+  var caughtTimeoutOnRequest = false;
+  var caughtTimeoutOnResponse = false;
+  process.on('exit', function() {
+    assert(!caughtTimeoutOnRequest);
+    assert(caughtTimeoutOnResponse);
+  });
+  var server = http.createServer(function(req, res) {
+    // just do nothing, we should get a timeout event.
+    req.setTimeout(50, function(socket) {
+      caughtTimeoutOnRequest = true;
+    });
+    res.on('timeout', function(socket) {
+      caughtTimeoutOnResponse = true;
+    });
+  });
+  server.on('timeout', function(socket) {
+    socket.destroy();
+    server.close();
+    cb();
+  });
+  server.listen(common.PORT);
+  http.get({ port: common.PORT }).on('error', function() {});
+});
+
+test(function serverResponseTimeoutWithPipeline(cb) {
+  var caughtTimeout = '';
+  process.on('exit', function() {
+    assert.equal(caughtTimeout, '/2');
+  });
+  var server = http.createServer(function(req, res) {
+    res.setTimeout(50, function() {
+      caughtTimeout += req.url;
+    });
+    if (req.url === '/1') res.end();
+  });
+  server.on('timeout', function(socket) {
+    socket.destroy();
+    server.close();
+    cb();
+  });
+  server.listen(common.PORT);
+  var c = net.connect({ port: common.PORT, allowHalfOpen: true }, function() {
+    c.write('GET /1 HTTP/1.1\r\nHost: localhost\r\n\r\n');
+    c.write('GET /2 HTTP/1.1\r\nHost: localhost\r\n\r\n');
+    c.write('GET /3 HTTP/1.1\r\nHost: localhost\r\n\r\n');
+  });
+});
+
+test(function idleTimeout(cb) {
+  var caughtTimeoutOnRequest = false;
+  var caughtTimeoutOnResponse = false;
+  var caughtTimeoutOnServer = false;
+  process.on('exit', function() {
+    assert(!caughtTimeoutOnRequest);
+    assert(!caughtTimeoutOnResponse);
+    assert(caughtTimeoutOnServer);
+  });
+  var server = http.createServer(function(req, res) {
+    req.on('timeout', function(socket) {
+      caughtTimeoutOnRequest = true;
+    });
+    res.on('timeout', function(socket) {
+      caughtTimeoutOnResponse = true;
+    });
+    res.end();
+  });
+  server.setTimeout(50, function(socket) {
+    caughtTimeoutOnServer = true;
+    socket.destroy();
+    server.close();
+    cb();
+  });
+  server.listen(common.PORT);
+  var c = net.connect({ port: common.PORT, allowHalfOpen: true }, function() {
+    c.write('GET /1 HTTP/1.1\r\nHost: localhost\r\n\r\n');
+    // Keep-Alive
+  });
+});