1use backoff::SystemClock;
2use backoff::exponential::ExponentialBackoff;
3use backoff::future::retry;
4use reqwest::Response;
5use url::Url;
6
7pub async fn get_with_retries(
8 url: Url,
9 retry_policy: ExponentialBackoff<SystemClock>,
10) -> Result<Response, reqwest::Error> {
11 let operation = || async {
12 let response = reqwest::get(url.clone())
13 .await
14 .and_then(|resp| resp.error_for_status());
15 match response {
16 Ok(doc) => Ok(doc),
17 Err(e) if crate::error::reqwest::is_retryable(&e) => Err(backoff::Error::transient(e)),
18 Err(e) => Err(backoff::Error::permanent(e)),
19 }
20 };
21 retry(retry_policy, operation).await
22}