kopia lustrzana https://github.com/c9/core
Fix memory leaks in rate limiter
rodzic
2afa1ad468
commit
2a99b3449d
|
@ -6,26 +6,24 @@ var error = require("http-error");
|
|||
module.exports = ratelimit;
|
||||
|
||||
function ratelimit(key, duration, max) {
|
||||
var limit = {};
|
||||
var counts = {};
|
||||
return function(req, res, next) {
|
||||
var handle = req.params[key];
|
||||
|
||||
var lim = limit[handle] || (limit[handle] = []);
|
||||
var now = Date.now();
|
||||
for (var i = 0; i < lim.length; i++) {
|
||||
if (now - lim[i] > duration) {
|
||||
lim.splice(i, 1);
|
||||
i--;
|
||||
}
|
||||
else break;
|
||||
}
|
||||
if (lim.length > max) {
|
||||
counts[handle] = counts[handle] || 0;
|
||||
if (counts[handle] >= max) {
|
||||
var err = new error.TooManyRequests("Rate limit exceeded");
|
||||
err.retryIn = duration - (Date.now() - lim[0]);
|
||||
next(err);
|
||||
return;
|
||||
err.retryIn = Math.min(duration, 5000);
|
||||
return next(err);
|
||||
}
|
||||
lim.push(Date.now());
|
||||
|
||||
counts[handle]++;
|
||||
setTimeout(function () {
|
||||
counts[handle]--;
|
||||
if (counts[handle] == 0) {
|
||||
delete counts[handle];
|
||||
}
|
||||
}, duration);
|
||||
|
||||
return next();
|
||||
};
|
||||
|
|
Ładowanie…
Reference in New Issue