Logo

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