Skip to main content

dfx_core/http/
get.rs

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}