Merge pull request +14872 from c9/api-ratelimit-collab

Add ratelimits to collab
pull/365/head
Tim Robinson 2016-10-06 09:13:48 -07:00 zatwierdzone przez GitHub
commit 8531719c2e
2 zmienionych plików z 40 dodań i 33 usunięć

9
node_modules/c9/ratelimit.js wygenerowano vendored
Wyświetl plik

@ -30,8 +30,15 @@ function ratelimit(key, duration, max) {
return true;
}
// Returns a deep value from an object. E.g. resolveValue({user: {id: 5}}, "user.id") === 5
function resolveValue(obj, path) {
return path.split('.').reduce(function(prev, curr) {
return prev ? prev[curr] : undefined;
}, obj);
}
return function(req, res, next) {
var handle = req.params[key];
var handle = resolveValue(req.params, key);
requests[handle] = requests[handle] || [];
if (requests[handle].length >= max) {

64
node_modules/c9/ratelimit_test.js wygenerowano vendored
Wyświetl plik

@ -5,6 +5,7 @@ require("c9/inline-mocha")(module);
var ratelimit = require("./ratelimit");
var assert = require("assert");
var async = require("async");
var sinon = require("sinon");
describe("ratelimit", function() {
@ -31,7 +32,16 @@ describe("ratelimit", function() {
});
});
it("Should work with deep keys", function (done) {
var limiter = ratelimit("user.id", 10, 1);
limiter({params: {user: {id: "hey"}}}, null, function (err) {
assert(!err, err);
limiter({params: {user: {id: "yay"}}}, null, function (err) {
assert(!err, err);
done();
});
});
});
it("Should work again after a delay", function (done) {
var limiter = ratelimit("username", 10, 1);
@ -68,37 +78,27 @@ describe("ratelimit", function() {
});
it("Should expire keys at the correct times", function (done) {
var clock = sinon.useFakeTimers();
var limiter = ratelimit("username", 50, 2);
async.series([
function(next) {
limiter({params: {username: "mario"}}, null, function(err) {
assert(!err, err);
setTimeout(next, 25);
});
},
function (next) {
limiter({params: {username: "mario"}}, null, function(err) {
assert(!err, err);
setTimeout(next, 40);
});
},
function (next) {
limiter({params: {username: "mario"}}, null, function(err) {
assert(!err, err);
limiter({params: {username: "mario"}}, null, function(err) {
assert(err);
assert.equal(err.code, 429);
setTimeout(next, 20);
});
});
},
function (next) {
limiter({params: {username: "mario"}}, null, function(err) {
assert(!err, err);
next();
});
}
], done);
limiter({params: {username: "mario"}}, null, function(err){
assert(!err, err);
});
clock.tick(40);
limiter({params: {username: "mario"}}, null, function(err){
assert(!err, err);
});
clock.tick(45);
limiter({params: {username: "mario"}}, null, function(err){
assert(!err, err);
});
limiter({params: {username: "mario"}}, null, function(err){
assert(err);
assert.equal(err.code, 429);
});
clock.tick(40);
limiter({params: {username: "mario"}}, null, function(err){
assert(!err, err);
});
done();
});
});