Show retries for HTTP status code errors (#13897)
Using a companion change in the middleware (https://github.com/TrueLayer/reqwest-middleware/pull/235, forked&tagged pending review), we can check and show retries for HTTP status core errors, to consistently report retries again. We fix two cases: * Show retries for status code errors for cache client requests * Show retries for status code errors for Python download requests Not handled: * Show previous retries when a distribution download fails mid-streaming * Perform retries when a distribution download fails mid-streaming * Show previous retries when a Python download fails mid-streaming * Perform retries when a Python download fails mid-streaming
This commit is contained in:
@@ -53,6 +53,12 @@ pub enum Error {
|
||||
TooManyParts(String),
|
||||
#[error("Failed to download {0}")]
|
||||
NetworkError(DisplaySafeUrl, #[source] WrappedReqwestError),
|
||||
#[error("Request failed after {retries} retries")]
|
||||
NetworkErrorWithRetries {
|
||||
#[source]
|
||||
err: Box<Error>,
|
||||
retries: u32,
|
||||
},
|
||||
#[error("Failed to download {0}")]
|
||||
NetworkMiddlewareError(DisplaySafeUrl, #[source] anyhow::Error),
|
||||
#[error("Failed to extract archive: {0}")]
|
||||
@@ -1143,8 +1149,20 @@ fn parse_json_downloads(
|
||||
}
|
||||
|
||||
impl Error {
|
||||
pub(crate) fn from_reqwest(url: DisplaySafeUrl, err: reqwest::Error) -> Self {
|
||||
Self::NetworkError(url, WrappedReqwestError::from(err))
|
||||
pub(crate) fn from_reqwest(
|
||||
url: DisplaySafeUrl,
|
||||
err: reqwest::Error,
|
||||
retries: Option<u32>,
|
||||
) -> Self {
|
||||
let err = Self::NetworkError(url, WrappedReqwestError::from(err));
|
||||
if let Some(retries) = retries {
|
||||
Self::NetworkErrorWithRetries {
|
||||
err: Box::new(err),
|
||||
retries,
|
||||
}
|
||||
} else {
|
||||
err
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn from_reqwest_middleware(
|
||||
@@ -1260,10 +1278,15 @@ async fn read_url(
|
||||
.await
|
||||
.map_err(|err| Error::from_reqwest_middleware(url.clone(), err))?;
|
||||
|
||||
// Ensure the request was successful.
|
||||
response
|
||||
.error_for_status_ref()
|
||||
.map_err(|err| Error::from_reqwest(url, err))?;
|
||||
let retry_count = response
|
||||
.extensions()
|
||||
.get::<reqwest_retry::RetryCount>()
|
||||
.map(|retries| retries.value());
|
||||
|
||||
// Check the status code.
|
||||
let response = response
|
||||
.error_for_status()
|
||||
.map_err(|err| Error::from_reqwest(url, err, retry_count))?;
|
||||
|
||||
let size = response.content_length();
|
||||
let stream = response
|
||||
|
||||
Reference in New Issue
Block a user