A lexicon-driven AppView for ATProto.
1/// Parse rate-limit sleep duration from response headers.
2/// Checks `RateLimit-Reset` (Unix timestamp, used by XRPC servers) first,
3/// then `retry-after` (seconds), defaulting to 5s.
4pub fn parse_retry_after(headers: &reqwest::header::HeaderMap) -> u64 {
5 if let Some(reset) = headers
6 .get("ratelimit-reset")
7 .and_then(|v| v.to_str().ok())
8 .and_then(|v| v.parse::<i64>().ok())
9 {
10 let now = std::time::SystemTime::now()
11 .duration_since(std::time::UNIX_EPOCH)
12 .unwrap_or_default()
13 .as_secs() as i64;
14 let wait = (reset - now).max(1) as u64;
15 return wait.min(120);
16 }
17
18 headers
19 .get("retry-after")
20 .and_then(|v| v.to_str().ok())
21 .and_then(|v| v.parse::<u64>().ok())
22 .unwrap_or(5)
23 .min(120)
24}