reqwest_retry/
lib.rs

1//! Middleware to retry failed HTTP requests built on [`reqwest_middleware`].
2//!
3//! Use [`RetryTransientMiddleware`] to retry failed HTTP requests. Retry control flow is managed
4//! by a [`RetryPolicy`].
5//!
6//! ## Example
7//!
8//! ```
9//! use reqwest_middleware::{ClientBuilder, ClientWithMiddleware};
10//! use reqwest_retry::{RetryTransientMiddleware, policies::ExponentialBackoff};
11//!
12//! async fn run_retries() {
13//!     // Retry up to 3 times with increasing intervals between attempts.
14//!     let retry_policy = ExponentialBackoff::builder().build_with_max_retries(3);
15//!     let client = ClientBuilder::new(reqwest::Client::new())
16//!         .with(RetryTransientMiddleware::new_with_policy(retry_policy))
17//!         .build();
18//!
19//!     client
20//!         .get("https://truelayer.com")
21//!         .header("foo", "bar")
22//!         .send()
23//!         .await
24//!         .unwrap();
25//! }
26//! ```
27
28mod middleware;
29mod retryable;
30mod retryable_strategy;
31
32pub use retry_policies::{policies, Jitter, RetryDecision, RetryPolicy};
33use thiserror::Error;
34
35pub use middleware::RetryTransientMiddleware;
36pub use retryable::Retryable;
37pub use retryable_strategy::{
38    default_on_request_failure, default_on_request_success, DefaultRetryableStrategy,
39    RetryableStrategy,
40};
41
42/// Custom error type to attach the number of retries to the error message.
43#[derive(Debug, Error)]
44pub enum RetryError {
45    #[error("Request failed after {retries} retries")]
46    WithRetries {
47        retries: u32,
48        #[source]
49        err: reqwest_middleware::Error,
50    },
51    #[error(transparent)]
52    Error(reqwest_middleware::Error),
53}