use crate::io::http::HttpMethod;
use core::time::Duration;
use tower::layer::util::{Identity, Stack};
use tower::timeout::TimeoutLayer;
use tower::ServiceBuilder;
#[derive(Clone, Copy, Debug)]
pub struct HttpPolicy {
pub timeout: Duration,
pub connect_timeout: Duration,
pub max_retries: usize,
}
impl HttpPolicy {
pub fn max_attempts(self) -> usize {
self.max_retries.saturating_add(1)
}
}
impl Default for HttpPolicy {
fn default() -> Self {
Self {
timeout: Duration::from_secs(30),
connect_timeout: Duration::from_secs(10),
max_retries: 2,
}
}
}
pub fn http_timeout_layer() -> TimeoutLayer {
TimeoutLayer::new(shared_http_policy().timeout)
}
pub fn http_service_builder() -> ServiceBuilder<Stack<TimeoutLayer, Identity>> {
ServiceBuilder::new().layer(http_timeout_layer())
}
pub fn shared_http_policy() -> HttpPolicy {
HttpPolicy::default()
}
pub fn should_retry(method: &HttpMethod, status_code: Option<u16>) -> bool {
if !matches!(method, HttpMethod::Get) {
false
} else {
match status_code {
| Some(code) if code == 408 || code == 429 || code >= 500 => true,
| Some(_) => false,
| None => true,
}
}
}