Skip to main content

twitter_internal_api/utils/
headers.rs

1use reqwest::header::{HeaderMap, HeaderName};
2use serde::{Deserialize, Serialize};
3
4#[derive(Deserialize, Serialize, Clone, Debug)]
5pub struct RateLimitHeaders {
6    pub rate_limit_limit: Option<i64>,
7    pub rate_limit_remaining: Option<i64>,
8    pub rate_limit_rest: Option<i64>,
9}
10
11#[tracing::instrument(name = "extract_headers", skip_all)]
12pub fn extract_headers(headers: HeaderMap) -> RateLimitHeaders {
13    let mut output = RateLimitHeaders {
14        rate_limit_limit: None,
15        rate_limit_remaining: None,
16        rate_limit_rest: None,
17    };
18    for (key, value) in headers.into_iter() {
19        let key = key
20            .unwrap_or(HeaderName::from_static("tmp"))
21            .as_str()
22            .to_lowercase();
23        let value = value.to_str().unwrap_or_default();
24        match key.as_str() {
25            "x-rate-limit-limit" => {
26                let v = value.parse::<i64>().unwrap_or(1);
27                output.rate_limit_limit = Some(v);
28            }
29            "x-rate-limit-remaining" => {
30                let v = value.parse::<i64>().unwrap_or(1);
31                output.rate_limit_remaining = Some(v);
32            }
33            "x-rate-limit-reset" => {
34                let v = value.parse::<i64>().unwrap_or(1);
35                output.rate_limit_rest = Some(v);
36            }
37            _ => {}
38        }
39    }
40    output
41}