Skip to content

Commit

Permalink
Idle timeout changes
Browse files Browse the repository at this point in the history
- setTimeout should active the timeout too. (test-net-set-timeout tests
  this.)

- 'timeout' event is not automatically followed by an 'error' event. That
  is the user is now responsible for destroying the stream if there is an
  idle timeout.
  • Loading branch information
ry committed May 12, 2010
1 parent f7ff548 commit d2cff34
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 15 deletions.
16 changes: 11 additions & 5 deletions doc/api.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -2124,8 +2124,11 @@ call `stream.end()` when this event is emitted.

`function () { }`

Emitted if the stream times out from inactivity. The
`'close'` event will be emitted immediately following this event.
Emitted if the stream times out from inactivity. This is only to notify that
the stream has been idle. The user must manually close the connection.

See also: `stream.setTimeout()`


### Event: 'drain'

Expand Down Expand Up @@ -2233,10 +2236,13 @@ Resumes reading after a call to `pause()`.
### stream.setTimeout(timeout)

Sets the stream to timeout after `timeout` milliseconds of inactivity on
the stream. By default all `net.Stream` objects have a timeout of 60
seconds (60000 ms).
the stream. By default `net.Stream` do not have a timeout.

When an idle timeout is triggered the stream will receive a `'timeout'`
event but the connection will not be severed. The user must manually `end()`
or `destroy()` the stream.

If `timeout` is 0, then the idle timeout is disabled.
If `timeout` is 0, then the existing idle timeout is disabled.

### stream.setNoDelay(noDelay=true)

Expand Down
6 changes: 4 additions & 2 deletions lib/net.js
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,6 @@ var timeout = new (function () {
remove(first);
assert(first != peek(list));
first.emit('timeout');
first.destroy(new Error('idle timeout'));
}
}
debug(msecs + ' list empty');
Expand Down Expand Up @@ -816,7 +815,10 @@ Stream.prototype.setKeepAlive = function (enable, time) {
};

Stream.prototype.setTimeout = function (msecs) {
timeout.enroll(this, msecs);
if (msecs > 0) {
timeout.enroll(this, msecs);
if (this.fd) { timeout.active(this); }
}
};


Expand Down
11 changes: 3 additions & 8 deletions test/pummel/test-tcp-timeout.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,18 @@ starttime = null;
timeouttime = null;
timeout = 1000;

gotError = false

var echo_server = net.createServer(function (socket) {
socket.setTimeout(timeout);

socket.addListener("timeout", function () {
puts("server timeout");
timeouttime = new Date;
p(timeouttime);
socket.destroy();
});

socket.addListener("error", function (e) {
assert.ok(e instanceof Error);
gotError = true;
throw new Error("Server side socket should not get error. We disconnect willingly.");
})

socket.addListener("data", function (d) {
Expand Down Expand Up @@ -59,8 +57,7 @@ client.addListener("data", function (chunk) {
});

client.addListener("timeout", function () {
puts("client timeout - this shouldn't happen");
assert.ok(false);
throw new Error("client timeout - this shouldn't happen");
});

client.addListener("end", function () {
Expand All @@ -84,6 +81,4 @@ process.addListener("exit", function () {

// Allow for 800 milliseconds more
assert.ok(diff < timeout + 800);

assert.ok(gotError);
});
39 changes: 39 additions & 0 deletions test/simple/test-net-set-timeout.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
require("../common");
var sys = require('sys'),
http = require('http');

server = http.createServer(function (req, res) {
sys.puts('got request. setting 1 second timeout');
req.connection.setTimeout(500);

req.connection.addListener('timeout', function(){
sys.debug("TIMEOUT");

var body="timeout\n";
res.writeHead(200, {
'Content-Type': 'text/plain',
'Content-Length': body.length,
'Connection':'close'
});
res.end(body);
req.connection.end();
server.close();
});
});
server.listen(8000);


server.addListener('listening', function () {
sys.puts('Server running at http://127.0.0.1:8000/');

errorTimer =setTimeout(function () {
throw new Error('Timeout was not sucessful');
}, 2000);

http.cat('http://localhost:8000/', 'utf8', function (err, content) {
clearTimeout(errorTimer);
if (err) throw err;
sys.puts('HTTP REQUEST COMPLETE (this is good)');
sys.puts(content);
});
});

0 comments on commit d2cff34

Please sign in to comment.