package com.github.aesteve.vertx.nubes.handlers.impl;
import com.github.aesteve.vertx.nubes.Config;
import com.github.aesteve.vertx.nubes.context.ClientAccesses;
import com.github.aesteve.vertx.nubes.context.RateLimit;
import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import io.vertx.core.json.JsonObject;
import io.vertx.core.shareddata.LocalMap;
import io.vertx.ext.web.RoutingContext;
public class RateLimitationHandler implements Handler<RoutingContext> {
private final RateLimit rateLimit;
private RateLimitationHandler(RateLimit rateLimit) {
this.rateLimit = rateLimit;
}
public static RateLimitationHandler create(Config config) {
return new RateLimitationHandler(config.getRateLimit());
}
@Override
public void handle(RoutingContext context) {
Vertx vertx = context.vertx();
LocalMap<Object, Object> rateLimitations = vertx.sharedData().getLocalMap("mvc.rateLimitation");
String clientIp = context.request().remoteAddress().host();
JsonObject json = (JsonObject) rateLimitations.get(clientIp);
ClientAccesses accesses;
if (json == null) {
accesses = new ClientAccesses();
} else {
accesses = ClientAccesses.fromJsonObject(json);
}
accesses.newAccess();
rateLimitations.put(clientIp, accesses.toJsonObject());
if (accesses.isOverLimit(rateLimit)) {
context.fail(420);
} else {
context.next();
}
}
}