#rate-limiting #actix-web #limitation #web-dev #rate-api

actix-limitation

Rate limiter using a fixed window counter for arbitrary keys, backed by Redis for Actix Web

10 releases

0.5.1 Sep 16, 2023
0.5.0 Sep 16, 2023
0.4.0 Sep 10, 2022
0.3.0 Jul 11, 2022
0.1.2 Apr 11, 2020

#493 in Web programming

Download history 39/week @ 2023-11-28 27/week @ 2023-12-05 27/week @ 2023-12-12 20/week @ 2023-12-19 33/week @ 2023-12-26 22/week @ 2024-01-02 18/week @ 2024-01-09 23/week @ 2024-01-16 26/week @ 2024-01-23 23/week @ 2024-01-30 1/week @ 2024-02-06 12/week @ 2024-02-13 126/week @ 2024-02-20 176/week @ 2024-02-27 145/week @ 2024-03-05 309/week @ 2024-03-12

768 downloads per month

MIT/Apache

53KB
897 lines

actix-limitation

Rate limiter using a fixed window counter for arbitrary keys, backed by Redis for Actix Web.
Originally based on https://github.com/fnichol/limitation.

crates.io Documentation Apache 2.0 or MIT licensed Dependency Status

Examples

[dependencies]
actix-web = "4"
actix-limitation = "0.5"
use actix_limitation::{Limiter, RateLimiter};
use actix_session::SessionExt as _;
use actix_web::{dev::ServiceRequest, get, web, App, HttpServer, Responder};
use std::{sync::Arc, time::Duration};

#[get("/{id}/{name}")]
async fn index(info: web::Path<(u32, String)>) -> impl Responder {
    format!("Hello {}! id:{}", info.1, info.0)
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    let limiter = web::Data::new(
        Limiter::builder("redis://127.0.0.1")
            .key_by(|req: &ServiceRequest| {
                req.get_session()
                    .get(&"session-id")
                    .unwrap_or_else(|_| req.cookie(&"rate-api-id").map(|c| c.to_string()))
            })
            .limit(5000)
            .period(Duration::from_secs(3600)) // 60 minutes
            .build()
            .unwrap(),
    );
    HttpServer::new(move || {
        App::new()
            .wrap(RateLimiter::default())
            .app_data(limiter.clone())
            .service(index)
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

Dependencies

~19–33MB
~583K SLoC