Rate Limit
Limitation de requetes par IP avec fenetre glissante.
Application sur une route — urls.rs
urls
use runique::macros::routeur::register_url::register_pending;
use runique::prelude::*;
use std::sync::Arc;
pub fn routes() -> Router {
let limiter = Arc::new(
RateLimiter::new()
.max_requests(5)
.retry_after(60),
);
// register_pending est requis pour que {% link 'nom_route' %}
// fonctionne dans les templates Tera.
register_pending("upload_image", "/upload-image");
let upload_route = Router::new()
.route("/upload-image", view!(upload_handler))
.route_layer(middleware::from_fn_with_state(limiter, rate_limit_middleware));
urlpatterns! {
// autres routes...
}.merge(upload_route)
}
Application sur une route — urls.rs
urls
use runique::macros::routeur::register_url::register_pending;
use runique::prelude::*;
use std::sync::Arc;
pub fn routes() -> Router {
let limiter = Arc::new(
RateLimiter::new()
.max_requests(5)
.retry_after(60),
);
// register_pending est requis pour que {% link 'nom_route' %}
// fonctionne dans les templates Tera.
register_pending("upload_image", "/upload-image");
let upload_route = Router::new()
.route("/upload-image", view!(upload_handler))
.route_layer(middleware::from_fn_with_state(limiter, rate_limit_middleware));
urlpatterns! {
// autres routes...
}.merge(upload_route)
}
Exemples de configuration
// 5 requetes par minute
RateLimiter::new().max_requests(5).retry_after(60)
// 3 requetes par 5 minutes
RateLimiter::new().max_requests(3).retry_after(300)
// 100 requetes par minute (defaut : 60/60)
RateLimiter::new().max_requests(100).retry_after(60)
Exemples de configuration
// 5 requetes par minute
RateLimiter::new().max_requests(5).retry_after(60)
// 3 requetes par 5 minutes
RateLimiter::new().max_requests(3).retry_after(300)
// 100 requetes par minute (defaut : 60/60)
RateLimiter::new().max_requests(100).retry_after(60)
Fonctionnement
// Fenetre glissante par adresse IP.
// Compteur reinitialise apres retry_after secondes.
// Reponse quand la limite est depassee :
HTTP/1.1 429 Too Many Requests
Retry-After: 42
// Le header Retry-After indique
// le delai avant la prochaine fenetre.
Fonctionnement
// Fenetre glissante par adresse IP.
// Compteur reinitialise apres retry_after secondes.
// Reponse quand la limite est depassee :
HTTP/1.1 429 Too Many Requests
Retry-After: 42
// Le header Retry-After indique
// le delai avant la prochaine fenetre.
Ordre dans le builder
// Les middlewares custom s''inserent au slot 20+.
// Ils s''executent AVANT la session et le CSRF.
Extensions(0)
-> ErrorHandler(10)
-> RateLimiter(20) // ici
-> Cache(40)
-> Session(50)
-> CSRF(60)
-> routes
Ordre dans le builder
// Les middlewares custom s''inserent au slot 20+.
// Ils s''executent AVANT la session et le CSRF.
Extensions(0)
-> ErrorHandler(10)
-> RateLimiter(20) // ici
-> Cache(40)
-> Session(50)
-> CSRF(60)
-> routes