leyline-http 0.1.5

HTTP client that impersonates Chrome, Firefox, and Safari on the wire: TLS (JA3/JA4), HTTP/2, and HTTP/3 fingerprints
Documentation
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum HeaderAnchor {
    BeforeCchUa,
    AfterCchUa,
    AfterCchUaMobile,
    AfterCchUaPlatform,
    AfterUserAgent,
    AfterAccept,
    AfterContentType,
    AfterFetchDest,
    BeforeAcceptEncoding,
}

impl HeaderAnchor {
    pub(crate) fn anchor_name(&self) -> &'static str {
        match self {
            Self::BeforeCchUa | Self::AfterCchUa => "sec-ch-ua",
            Self::AfterCchUaMobile => "sec-ch-ua-mobile",
            Self::AfterCchUaPlatform => "sec-ch-ua-platform",
            Self::AfterUserAgent => "user-agent",
            Self::AfterAccept => "accept",
            Self::AfterContentType => "content-type",
            Self::AfterFetchDest => "sec-fetch-dest",
            Self::BeforeAcceptEncoding => "accept-encoding",
        }
    }

    pub(crate) fn is_before(&self) -> bool {
        matches!(self, Self::BeforeCchUa | Self::BeforeAcceptEncoding)
    }
}

pub(crate) fn infer_anchor(name: &str) -> Option<HeaderAnchor> {
    let lower = name.to_ascii_lowercase();
    match lower.as_str() {
        "origin" => Some(HeaderAnchor::AfterContentType),

        "authorization" | "x-requested-with" | "x-csrf-token" | "x-requested-by" | "x-api-key" => {
            Some(HeaderAnchor::AfterUserAgent)
        }

        _ => None,
    }
}

#[cfg(test)]
mod tests;