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}