Rate limiter using a fixed window counter for arbitrary keys, backed by Redis for Actix Web.
Originally based on https://github.com/fnichol/limitation.
toml
[dependencies]
actix-web = "4"
actix-limitation = "0.3"
```rust use actixlimitation::{Limiter, RateLimiter}; use actixsession::SessionExt as ; use actixweb::{dev::ServiceRequest, get, web, App, HttpServer, Responder}; use std::{sync::Arc, time::Duration};
async fn index(info: web::Path<(u32, String)>) -> impl Responder { format!("Hello {}! id:{}", info.1, info.0) }
async fn main() -> std::io::Result<()> { let limiter = web::Data::new( Limiter::builder("redis://127.0.0.1") .keyby(|req: &ServiceRequest| { req.getsession() .get(&"session-id") .unwraporelse(|| req.cookie(&"rate-api-id").map(|c| c.tostring())) }) .limit(5000) .period(Duration::fromsecs(3600)) // 60 minutes .build() .unwrap(), ); HttpServer::new(move || { App::new() .wrap(RateLimiter::default()) .appdata(limiter.clone()) .service(index) }) .bind(("127.0.0.1", 8080))? .run() .await } ```