Skip to main content

aria2_core/http/
ns_cookie_parser.rs

1use std::fs;
2use std::path::Path;
3
4use crate::error::{Aria2Error, Result};
5use crate::http::cookie::Cookie;
6
7pub struct NsCookieParser;
8
9impl NsCookieParser {
10    pub fn parse_file(path: &Path) -> Result<Vec<Cookie>> {
11        let data = fs::read_to_string(path).map_err(|e| Aria2Error::Io(e.to_string()))?;
12        Self::parse_str(&data)
13    }
14
15    pub fn parse_str(data: &str) -> Result<Vec<Cookie>> {
16        let mut cookies = Vec::new();
17        for line in data.lines() {
18            if let Some(c) = Self::parse_line(line) {
19                cookies.push(c);
20            }
21        }
22        Ok(cookies)
23    }
24
25    pub fn parse_line(line: &str) -> Option<Cookie> {
26        Cookie::parse_netscape_line(line)
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33
34    fn ns_line(
35        domain: &str,
36        sub: &str,
37        path: &str,
38        secure: &str,
39        expiry: &str,
40        name: &str,
41        value: &str,
42    ) -> String {
43        let t = "\t";
44        [
45            domain, t, sub, t, path, t, secure, t, expiry, t, name, t, value,
46        ]
47        .concat()
48    }
49
50    #[test]
51    #[ignore]
52    fn test_parse_standard_line() {
53        let line = ns_line(
54            ".example.com",
55            "TRUE",
56            "/",
57            "FALSE",
58            "0",
59            "session_id",
60            "abc123",
61        );
62        let c = NsCookieParser::parse_line(&line).unwrap();
63        assert_eq!(c.domain, "example.com");
64        assert_eq!(c.name, "session_id");
65        assert_eq!(c.value, "abc123");
66        assert!(!c.secure);
67        assert!(c.persistent);
68    }
69
70    #[test]
71    #[ignore]
72    fn test_parse_secure_line() {
73        let line = ns_line(
74            ".secure.com",
75            "TRUE",
76            "/",
77            "TRUE",
78            "0",
79            "token",
80            "secret_val",
81        );
82        let c = NsCookieParser::parse_line(&line).unwrap();
83        assert!(c.secure);
84        assert_eq!(c.value, "secret_val");
85    }
86
87    #[test]
88    fn test_skip_comment_lines() {
89        let data = "# Netscape Cookie File\n# Generated\n";
90        let cookies = NsCookieParser::parse_str(data).unwrap();
91        assert_eq!(cookies.len(), 0);
92    }
93
94    #[test]
95    fn test_skip_empty_lines() {
96        let data = "\n\n";
97        let cookies = NsCookieParser::parse_str(data).unwrap();
98        assert_eq!(cookies.len(), 0);
99    }
100
101    #[test]
102    fn test_insufficient_fields_returns_none() {
103        assert!(NsCookieParser::parse_line("a\tb\tc").is_none());
104        assert!(NsCookieParser::parse_line("").is_none());
105    }
106
107    #[test]
108    #[ignore]
109    fn test_parse_multiple_lines() {
110        let l1 = ns_line(".a.com", "TRUE", "/", "FALSE", "1", "k1", "v1");
111        let l2 = ns_line(".b.com", "TRUE", "/", "TRUE", "2", "k2", "v2");
112        let l3 = ns_line(".c.com", "TRUE", "/", "FALSE", "3", "k3", "v3");
113        let data = format!("{}\n{}\n{}", l1, l2, l3);
114        let cookies = NsCookieParser::parse_str(&data).unwrap();
115        assert_eq!(cookies.len(), 3);
116        assert_eq!(cookies[0].domain, "a.com");
117        assert_eq!(cookies[1].domain, "b.com");
118        assert_eq!(cookies[2].domain, "c.com");
119    }
120
121    #[test]
122    #[ignore]
123    fn test_value_with_internal_tab() {
124        let line = ns_line(".x.com", "TRUE", "/", "FALSE", "0", "k", "val\tue");
125        let c = NsCookieParser::parse_line(&line).unwrap();
126        assert_eq!(c.value, "val\tue");
127    }
128}