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:
konsti
2025-06-16 12:14:00 +02:00
committed by GitHub
parent 7c90c5be02
commit cd71ad1672
12 changed files with 205 additions and 146 deletions
+29 -6
View File
@@ -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