ddos
Version:
Configurable Denial-Of-Service prevention for http services
78 lines (73 loc) • 2.25 kB
JavaScript
var tape = require("tape");
tape("count and expiry test", function(t) {
const niv = require("npm-install-version");
niv.install("hapi@16");
var Hapi = require("hapi@16");
var request = require("request");
var QL = require("queuelib");
var Ddos = require("../");
t.plan(11);
var q = new QL();
var ddos = new Ddos({ burst: 3, limit: 4 });
const server = new Hapi.Server();
server.connection({ port: 3000, host: "localhost" });
server.route({
method: "GET",
path: "/",
handler: function(request, reply) {
reply("Hello, world!");
}
});
server.ext("onRequest", ddos.hapi.bind(ddos));
server.start(err => {
q.series(
[
lib => {
request("http://localhost:3000/", (err, res, body) => {
var key = Object.keys(ddos.table)[0];
t.deepEqual(ddos.table[key], { count: 1, expiry: 1 });
t.equal(res.statusCode, 200);
lib.done();
});
},
lib => {
request("http://localhost:3000/", (err, res, body) => {
var key = Object.keys(ddos.table)[0];
t.deepEqual(ddos.table[key], { count: 2, expiry: 1 });
t.equal(res.statusCode, 200);
lib.done();
});
},
lib => {
request("http://localhost:3000/", (err, res, body) => {
var key = Object.keys(ddos.table)[0];
t.deepEqual(ddos.table[key], { count: 3, expiry: 1 });
t.equal(res.statusCode, 200);
lib.done();
});
},
lib => {
request("http://localhost:3000/", (err, res, body) => {
var key = Object.keys(ddos.table)[0];
t.deepEqual(ddos.table[key], { count: 4, expiry: 2 });
t.equal(res.statusCode, 200);
lib.done();
});
},
lib => {
request("http://localhost:3000/", (err, res, body) => {
var key = Object.keys(ddos.table)[0];
t.deepEqual(ddos.table[key], { count: 5, expiry: 4 });
t.equal(res.statusCode, 429);
lib.done();
});
}
],
function() {
t.pass("ok");
ddos.end();
server.stop();
}
);
});
});