diff --git a/src/providers/redgifs.rs b/src/providers/redgifs.rs index c948bd7..78645dd 100644 --- a/src/providers/redgifs.rs +++ b/src/providers/redgifs.rs @@ -287,9 +287,11 @@ impl RedgifsProvider { } async fn authed_get(&self, url: &str, options: &ServerOptions) -> Result { - for attempt in 0..2 { - let force_refresh = attempt > 0; + const ATTEMPTS: u32 = 3; + let mut force_refresh = false; + for attempt in 0..ATTEMPTS { let token = self.redgifs_token(options, force_refresh).await?; + force_refresh = false; let mut requester = requester_or_default(options, CHANNEL_ID, "authed_get"); let response = requester .get_raw_with_headers( @@ -302,7 +304,17 @@ impl RedgifsProvider { .await .map_err(|error| Error::from(format!("request failed for {url}: {error}")))?; - if response.status().as_u16() == 401 && attempt == 0 { + let status = response.status().as_u16(); + let last_attempt = attempt + 1 == ATTEMPTS; + if status == 401 && !last_attempt { + force_refresh = true; + continue; + } + // RedGifs rate-limits bursty search/browse traffic with 429s; retry + // the same token after a short backoff instead of surfacing an + // empty result set to the client. + if status == 429 && !last_attempt { + tokio::time::sleep(std::time::Duration::from_secs(1)).await; continue; } if !response.status().is_success() {