Skip to main content

px_cloudflare/
cookie_extractor.rs

1use px_harvester::HarvestedCookie;
2
3/// Cookie name prefixes the CloudflareHandler considers session-relevant.
4///
5/// Includes CF Bot Management (`cf_clearance`, `__cf_bm`) plus the PX family
6/// because pedidosya-style CF→PX cascades set both during a single bypass.
7const SESSION_COOKIE_PREFIXES: &[&str] = &[
8    "cf_clearance",
9    "__cf_bm",
10    "_px",
11    "_pxvid",
12    "_pxhd",
13    "_pxde",
14    "pxcts",
15];
16
17pub fn is_session_cookie(name: &str) -> bool {
18    SESSION_COOKIE_PREFIXES.iter().any(|p| name.starts_with(p))
19}
20
21pub fn extract_session_cookies(cookies: &[HarvestedCookie]) -> Vec<HarvestedCookie> {
22    cookies
23        .iter()
24        .filter(|c| is_session_cookie(&c.name))
25        .cloned()
26        .collect()
27}
28
29#[cfg(test)]
30#[allow(clippy::expect_used, clippy::unwrap_used, clippy::panic)]
31mod tests {
32    use super::*;
33
34    fn cookie(name: &str) -> HarvestedCookie {
35        HarvestedCookie {
36            name: name.into(),
37            value: "v".into(),
38            domain: "x.com".into(),
39            path: "/".into(),
40        }
41    }
42
43    #[test]
44    fn keeps_cf_and_px_families() {
45        let input = vec![
46            cookie("cf_clearance"),
47            cookie("__cf_bm"),
48            cookie("_px3"),
49            cookie("_pxhd"),
50            cookie("_pxvid"),
51            cookie("pxcts"),
52            cookie("_pxde"),
53            cookie("peyas.sid"),
54            cookie("dhhPerseusEnvironment"),
55        ];
56        let out = extract_session_cookies(&input);
57        let names: Vec<&str> = out.iter().map(|c| c.name.as_str()).collect();
58        assert_eq!(out.len(), 7);
59        assert!(names.contains(&"cf_clearance"));
60        assert!(names.contains(&"__cf_bm"));
61        assert!(names.contains(&"_px3"));
62        assert!(names.contains(&"pxcts"));
63        assert!(!names.contains(&"peyas.sid"));
64        assert!(!names.contains(&"dhhPerseusEnvironment"));
65    }
66}