leyline/profile/
anchor.rs1#[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;