From 91e2a02dd2633c18e6efa6caa563bc0006c050eb Mon Sep 17 00:00:00 2001 From: Denis Cornehl Date: Mon, 9 Feb 2026 20:48:15 +0100 Subject: [PATCH] github-updater: recognize HTTP 429 as RateLimitReached --- .../docs_rs_repository_stats/src/github.rs | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/crates/lib/docs_rs_repository_stats/src/github.rs b/crates/lib/docs_rs_repository_stats/src/github.rs index a11ca49b8..dcc5daa4b 100644 --- a/crates/lib/docs_rs_repository_stats/src/github.rs +++ b/crates/lib/docs_rs_repository_stats/src/github.rs @@ -200,7 +200,9 @@ impl GitHub { let status = response.status(); let body = response.text().await?; - if status == StatusCode::FORBIDDEN + if status == StatusCode::TOO_MANY_REQUESTS { + Err(RateLimitReached.into()) + } else if status == StatusCode::FORBIDDEN && let Ok(api_error) = serde_json::from_str::(&body) && (api_error .documentation_url @@ -473,4 +475,28 @@ mod tests { Ok(()) } + + #[tokio::test] + async fn test_429_rate_limit() -> Result<()> { + let config = github_config()?; + let (mut server, updater) = mock_server_and_github(&config).await; + + let _m1 = server + .mock("POST", "/graphql") + .with_header("content-type", "application/json") + .with_status(429) + .create(); + + assert!( + updater + .fetch_repository( + &repository_name("https://gitlab.com/foo/bar").expect("repository_name failed"), + ) + .await + .unwrap_err() + .is::() + ); + + Ok(()) + } }