Skip to main content

leyline/profile/
anchor.rs

1#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
2#[non_exhaustive]
3pub enum HeaderAnchor {
4    AfterCchUa,
5    AfterCchUaMobile,
6    AfterCchUaPlatform,
7    AfterUserAgent,
8    AfterAccept,
9    AfterContentType,
10    AfterFetchDest,
11    BeforeAcceptEncoding,
12}
13
14impl HeaderAnchor {
15    pub(crate) fn anchor_name(&self) -> &'static str {
16        match self {
17            Self::AfterCchUa => "sec-ch-ua",
18            Self::AfterCchUaMobile => "sec-ch-ua-mobile",
19            Self::AfterCchUaPlatform => "sec-ch-ua-platform",
20            Self::AfterUserAgent => "user-agent",
21            Self::AfterAccept => "accept",
22            Self::AfterContentType => "content-type",
23            Self::AfterFetchDest => "sec-fetch-dest",
24            Self::BeforeAcceptEncoding => "accept-encoding",
25        }
26    }
27
28    pub(crate) fn is_before(&self) -> bool {
29        matches!(self, Self::BeforeAcceptEncoding)
30    }
31}
32
33pub(crate) fn infer_anchor(name: &str) -> Option<HeaderAnchor> {
34    let lower = name.to_ascii_lowercase();
35    match lower.as_str() {
36        "origin" => Some(HeaderAnchor::AfterContentType),
37
38        "authorization" | "x-requested-with" | "x-csrf-token" | "x-requested-by" | "x-api-key" => {
39            Some(HeaderAnchor::AfterUserAgent)
40        }
41
42        _ => None,
43    }
44}
45
46#[cfg(test)]
47mod tests;