reqwest_ratelimit/
lib.rs

1//! Middleware to rate-limit requests built on [`reqwest_middleware`].
2//!
3//! You're expected to provide your own [`RateLimiter`] implementation.
4//!
5//! ## Example
6//!
7//! ```
8#![doc = include_str!("example.rs")]
9//! ```
10use std::future::Future;
11
12use async_trait::async_trait;
13use http::Extensions;
14use reqwest::{Request, Response};
15use reqwest_middleware::{Next, Result};
16
17/// Request rate limiter.
18pub trait RateLimiter: Send + Sync + 'static {
19    /// Acquires a permit to issue the next request.
20    fn acquire_permit(&self) -> impl Future<Output = ()> + Send + '_;
21}
22
23/// Creates a new [`Middleware`] rate-limiting all requests using the provided [`RateLimiter`].
24pub fn all<R>(rate_limiter: R) -> Middleware<R> {
25    Middleware { rate_limiter }
26}
27
28/// Request rate-limiting middleware.
29pub struct Middleware<R> {
30    rate_limiter: R,
31}
32
33#[async_trait]
34impl<R: RateLimiter> reqwest_middleware::Middleware for Middleware<R> {
35    async fn handle(
36        &self,
37        req: Request,
38        extensions: &'_ mut Extensions,
39        next: Next<'_>,
40    ) -> Result<Response> {
41        self.rate_limiter.acquire_permit().await;
42        next.run(req, extensions).await
43    }
44}