aria2_core/http/
ns_cookie_parser.rs1use 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}