use crate::LoggingRetryableStrategy;
use reqwest::ClientBuilder;
use reqwest_middleware::ClientBuilder as ClientWithMiddlewareBuilder;
use reqwest_retry::{RetryTransientMiddleware, policies::ExponentialBackoff};
use std::time::Duration;
#[derive(Clone, Debug)]
#[non_exhaustive]
pub struct CommonRestConfig {
pub connect_timeout: Duration,
pub request_timeout: Duration,
pub tcp_keepalive: Duration,
pub max_retries: u32,
pub retry_backoff_bounds: (Duration, Duration),
}
impl Default for CommonRestConfig {
fn default() -> Self {
Self {
connect_timeout: Duration::from_secs(3),
request_timeout: Duration::from_secs(3),
tcp_keepalive: Duration::from_secs(60),
max_retries: 3,
retry_backoff_bounds: (Duration::from_millis(50), Duration::from_millis(500)),
}
}
}
impl CommonRestConfig {
pub fn apply_to_builder(
&self,
builder: ClientBuilder,
) -> Result<ClientWithMiddlewareBuilder, reqwest::Error> {
let client = builder
.connect_timeout(self.connect_timeout)
.timeout(self.request_timeout)
.tcp_keepalive(self.tcp_keepalive)
.build()?;
let retry_policy = ExponentialBackoff::builder()
.retry_bounds(self.retry_backoff_bounds.0, self.retry_backoff_bounds.1)
.build_with_max_retries(self.max_retries);
let retry_middleware = RetryTransientMiddleware::new_with_policy_and_strategy(
retry_policy,
LoggingRetryableStrategy::default(),
);
Ok(ClientWithMiddlewareBuilder::new(client).with(retry_middleware))
}
}