diff --git a/codex-rs/core-plugins/src/remote.rs b/codex-rs/core-plugins/src/remote.rs index 997986c4d1..952589e3f3 100644 --- a/codex-rs/core-plugins/src/remote.rs +++ b/codex-rs/core-plugins/src/remote.rs @@ -2000,28 +2000,36 @@ fn retry_delay_for_remote_plugin_catalog_get_error( retry_after: RetryAfterDelay, ) -> Option { match err { - RemotePluginCatalogError::Request { source, .. } => (source.is_timeout() - || source.is_connect()) - .then_some(REMOTE_PLUGIN_CATALOG_GET_RETRY_DELAY), + RemotePluginCatalogError::Request { source, .. } => { + (source.is_timeout() || source.is_connect() || source.is_body()) + .then_some(REMOTE_PLUGIN_CATALOG_GET_RETRY_DELAY) + } RemotePluginCatalogError::UnexpectedStatus { status, .. } if *status == reqwest::StatusCode::TOO_MANY_REQUESTS => { - match retry_after { - RetryAfterDelay::Delay(delay) if delay <= REMOTE_PLUGIN_CATALOG_GET_RETRY_DELAY => { - Some(delay) - } - RetryAfterDelay::Delay(_) | RetryAfterDelay::Unparsable => None, - RetryAfterDelay::None => Some(REMOTE_PLUGIN_CATALOG_GET_RETRY_DELAY), - } + bounded_retry_after_delay(retry_after) } RemotePluginCatalogError::UnexpectedStatus { status, .. } => { - (*status == reqwest::StatusCode::REQUEST_TIMEOUT || status.is_server_error()) - .then_some(REMOTE_PLUGIN_CATALOG_GET_RETRY_DELAY) + if *status == reqwest::StatusCode::REQUEST_TIMEOUT || status.is_server_error() { + bounded_retry_after_delay(retry_after) + } else { + None + } } _ => None, } } +fn bounded_retry_after_delay(retry_after: RetryAfterDelay) -> Option { + match retry_after { + RetryAfterDelay::Delay(delay) if delay <= REMOTE_PLUGIN_CATALOG_GET_RETRY_DELAY => { + Some(delay) + } + RetryAfterDelay::Delay(_) | RetryAfterDelay::Unparsable => None, + RetryAfterDelay::None => Some(REMOTE_PLUGIN_CATALOG_GET_RETRY_DELAY), + } +} + fn parse_retry_after_delay(headers: &reqwest::header::HeaderMap) -> RetryAfterDelay { let Some(retry_after) = headers.get(RETRY_AFTER) else { return RetryAfterDelay::None;