Giocando con Sinatra ho avuto l’esigenza di servire una determinata pagina solo con un certa frequenza (tecnicamente un rate-limit); la cosa si puo’ fare installando il middleware Rack:Throttle ma non volevo aggiungere un’altra gemma alle dipendenze…
In questo esempio se al server arriva piu’ di una richiesta in un intervallo di cinque secondi, rispondiamo a tono…
SECONDS_BETWEEN_REQUEST=5
enable :sessions
def ratelimit?
now=Time.new.to_i
session['lastrequest']||=0 #inizializza se non presente
result=(now-session['lastrequest'])<SECONDS_BETWEEN_REQUEST #passati dall'ultima richiesta ?
session['lastrequest']=now # aggiorna
return result
end
get '/' do
if ratelimit?
return "<h1>sorry, rate limit exceeded!</h1>"
end
"<h1>hello!</h1>"
end