Skip to content
Browse files

Abstract out a Server.prototype.pause method

  • Loading branch information...
1 parent d2828ea commit ae2087460b6f02dc1e81d85a3384be1d3a47e5f7 @ry ry committed
Showing with 31 additions and 10 deletions.
  1. +1 −1 benchmark/idle_server.js
  2. +30 −9 lib/net.js
View
2 benchmark/idle_server.js
@@ -11,7 +11,7 @@ server = net.Server(function (socket) {
});
-server.maxConnections = 128;
+//server.maxConnections = 128;
server.listen(9000);
View
39 lib/net.js
@@ -1087,7 +1087,7 @@ function Server (listener) {
// 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();
@@ -1147,6 +1147,28 @@ exports.createServer = function (listener) {
};
+// 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;
@@ -1159,14 +1181,7 @@ Server.prototype._rejectPending = function () {
// 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;
}
}
@@ -1285,6 +1300,11 @@ Server.prototype.close = function () {
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");
@@ -1294,6 +1314,7 @@ Server.prototype.close = function () {
}
};
+
var dummyFD = null;
var lastEMFILEWarning = 0;
// Ensures to have at least on free file-descriptor free.

0 comments on commit ae20874

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