px_cloudflare/
cookie_extractor.rs1use px_harvester::HarvestedCookie;
2
3const 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}