// Just in case we don't have a dummy fd.
getDummyFD();
- if (self._acceptTimer) {
+ if (self._pauseTimer) {
// Somehow the watcher got started again. Need to wait until
// the timer finishes.
self.watcher.stop();
};
+// Just stop trying to accepting connections for a while.
+// Useful for throttling against DoS attacks.
+Server.prototype.pause = function (msecs) {
+ // We're already paused.
+ if (this._pauseTimer) return;
+
+ var self = this;
+ msecs = msecs || 1000;
+
+ this.watcher.stop();
+
+ // Wait a second before accepting more.
+ this._pauseTimer = setTimeout(function () {
+ // Our fd should still be there. If someone calls server.close() then
+ // the pauseTimer should be cleared.
+ assert(parseInt(self.fd) >= 0);
+ self._pauseTimer = null;
+ self.watcher.start();
+ }, msecs);
+};
+
+
Server.prototype._rejectPending = function () {
var self = this;
var acceptCount = 0;
// Don't become DoS'd by incoming requests
if (++acceptCount > 50) {
- assert(!this._acceptTimer);
- this.watcher.stop();
- // Wait a second before accepting more.
- this._acceptTimer = setTimeout(function () {
- assert(parseInt(self.fd) >= 0);
- self._acceptTimer = null;
- self.watcher.start();
- }, 1000);
+ this.pause();
return;
}
}
close(self.fd);
self.fd = null;
+ if (self._pauseTimer) {
+ clearTimeout(self._pauseTimer);
+ self._pauseTimer = null;
+ }
+
if (self.type === "unix") {
fs.unlink(self.path, function () {
self.emit("close");
}
};
+
var dummyFD = null;
var lastEMFILEWarning = 0;
// Ensures to have at least on free file-descriptor free.