in tough/src/http.rs [248:299]
fn fetch_with_retries(
r: &mut RetryState,
cs: &HttpTransportBuilder,
url: &Url,
) -> Result<RetryRead, HttpError> {
trace!("beginning fetch for '{}'", url);
// create a reqwest client
let client = ClientBuilder::new()
.timeout(cs.timeout)
.connect_timeout(cs.connect_timeout)
.build()
.context(HttpClientSnafu)?;
// retry loop
loop {
// build the request
let request = build_request(&client, r.next_byte, url)?;
// send the GET request, then categories the outcome by converting to an HttpResult.
let http_result: HttpResult = client.execute(request).into();
match http_result {
HttpResult::Ok(response) => {
trace!("{:?} - returning from successful fetch", r);
return Ok(RetryRead {
retry_state: *r,
settings: *cs,
response,
url: url.clone(),
});
}
HttpResult::Fatal(err) => {
trace!("{:?} - returning fatal error from fetch: {}", r, err);
return Err(err).context(FetchFatalSnafu);
}
HttpResult::FileNotFound(err) => {
trace!("{:?} - returning file not found from fetch: {}", r, err);
return Err(err).context(FetchFileNotFoundSnafu);
}
HttpResult::Retryable(err) => {
trace!("{:?} - retryable error: {}", r, err);
if r.current_try >= cs.tries - 1 {
debug!("{:?} - returning failure, no more retries: {}", r, err);
return Err(err).context(FetchNoMoreRetriesSnafu { tries: cs.tries });
}
}
}
r.increment(cs);
std::thread::sleep(r.wait);
}
}