Rate Limit

Per-IP request limiting with sliding window.

● ● ●
use runique::prelude::*;

pub fn routes() -> Router {
    urlpatterns! {
        // other routes...
    }
    // .rate_limit(path, name, view!, max_requests, retry_after_secs, excluded_ips)
    .rate_limit(
        "/upload-image",
        "upload_image",
        view!(upload_handler),
        5,
        60,
        vec![],
    )
}
// 5 requests per minute
.rate_limit("/login", "login", view!(login_handler), 5, 60, vec![])

// 3 requests per 5 minutes
.rate_limit("/register", "register", view!(register_handler), 3, 300, vec![])

// Exclude specific IPs from rate limiting
.rate_limit("/api", "api", view!(api_handler), 100, 60, vec!["127.0.0.1".to_string()])
// Sliding window per IP address.
// Counter reset after retry_after seconds.

// Response when the limit is exceeded:
HTTP/1.1 429 Too Many Requests
Retry-After: 42

// The Retry-After header indicates
// the delay before the next window.
// Custom middlewares are inserted at slot 20+.
// They execute BEFORE session and CSRF.

Extensions(0)
  -> ErrorHandler(10)
  -> RateLimiter(20)   // here
  -> Cache(40)
  -> Session(50)
  -> CSRF(60)
  -> routes