const DEFAULT: u64 = 60;
pub(super) fn retry_after(response: &reqwest::Response) -> u64 {
let headers = response.headers();
let number = |name: &str| {
headers
.get(name)
.and_then(|value| value.to_str().ok())
.and_then(|value| value.trim().parse::<u64>().ok())
};
if let Some(after) = number("retry-after") {
return after.max(1);
}
let now = u64::try_from(time::OffsetDateTime::now_utc().unix_timestamp()).unwrap_or_default();
number("x-ratelimit-reset")
.map(|reset| reset.saturating_sub(now))
.filter(|seconds| *seconds > 0)
.unwrap_or(DEFAULT)
}
pub(super) fn rate_limited(response: &reqwest::Response) -> Option<u64> {
let headers = response.headers();
let exhausted = headers.contains_key("retry-after")
|| headers
.get("x-ratelimit-remaining")
.is_some_and(|remaining| remaining.as_bytes() == b"0");
exhausted.then(|| retry_after(response))
}
#[cfg(test)]
mod tests;