1 mod support;
2 use support::*;
3 
4 #[tokio::test]
cookie_response_accessor()5 async fn cookie_response_accessor() {
6     let server = server::http(move |_req| async move {
7         http::Response::builder()
8             .header("Set-Cookie", "key=val")
9             .header(
10                 "Set-Cookie",
11                 "expires=1; Expires=Wed, 21 Oct 2015 07:28:00 GMT",
12             )
13             .header("Set-Cookie", "path=1; Path=/the-path")
14             .header("Set-Cookie", "maxage=1; Max-Age=100")
15             .header("Set-Cookie", "domain=1; Domain=mydomain")
16             .header("Set-Cookie", "secure=1; Secure")
17             .header("Set-Cookie", "httponly=1; HttpOnly")
18             .header("Set-Cookie", "samesitelax=1; SameSite=Lax")
19             .header("Set-Cookie", "samesitestrict=1; SameSite=Strict")
20             .body(Default::default())
21             .unwrap()
22     });
23 
24     let client = reqwest::Client::new();
25 
26     let url = format!("http://{}/", server.addr());
27     let res = client.get(&url).send().await.unwrap();
28 
29     let cookies = res.cookies().collect::<Vec<_>>();
30 
31     // key=val
32     assert_eq!(cookies[0].name(), "key");
33     assert_eq!(cookies[0].value(), "val");
34 
35     // expires
36     assert_eq!(cookies[1].name(), "expires");
37     assert_eq!(
38         cookies[1].expires().unwrap(),
39         std::time::SystemTime::UNIX_EPOCH + std::time::Duration::from_secs(1445412480)
40     );
41 
42     // path
43     assert_eq!(cookies[2].name(), "path");
44     assert_eq!(cookies[2].path().unwrap(), "/the-path");
45 
46     // max-age
47     assert_eq!(cookies[3].name(), "maxage");
48     assert_eq!(
49         cookies[3].max_age().unwrap(),
50         std::time::Duration::from_secs(100)
51     );
52 
53     // domain
54     assert_eq!(cookies[4].name(), "domain");
55     assert_eq!(cookies[4].domain().unwrap(), "mydomain");
56 
57     // secure
58     assert_eq!(cookies[5].name(), "secure");
59     assert_eq!(cookies[5].secure(), true);
60 
61     // httponly
62     assert_eq!(cookies[6].name(), "httponly");
63     assert_eq!(cookies[6].http_only(), true);
64 
65     // samesitelax
66     assert_eq!(cookies[7].name(), "samesitelax");
67     assert!(cookies[7].same_site_lax());
68 
69     // samesitestrict
70     assert_eq!(cookies[8].name(), "samesitestrict");
71     assert!(cookies[8].same_site_strict());
72 }
73 
74 #[tokio::test]
cookie_store_simple()75 async fn cookie_store_simple() {
76     let server = server::http(move |req| async move {
77         if req.uri() == "/2" {
78             assert_eq!(req.headers()["cookie"], "key=val");
79         }
80         http::Response::builder()
81             .header("Set-Cookie", "key=val; HttpOnly")
82             .body(Default::default())
83             .unwrap()
84     });
85 
86     let client = reqwest::Client::builder()
87         .cookie_store(true)
88         .build()
89         .unwrap();
90 
91     let url = format!("http://{}/", server.addr());
92     client.get(&url).send().await.unwrap();
93 
94     let url = format!("http://{}/2", server.addr());
95     client.get(&url).send().await.unwrap();
96 }
97 
98 #[tokio::test]
cookie_store_overwrite_existing()99 async fn cookie_store_overwrite_existing() {
100     let server = server::http(move |req| async move {
101         if req.uri() == "/" {
102             http::Response::builder()
103                 .header("Set-Cookie", "key=val")
104                 .body(Default::default())
105                 .unwrap()
106         } else if req.uri() == "/2" {
107             assert_eq!(req.headers()["cookie"], "key=val");
108             http::Response::builder()
109                 .header("Set-Cookie", "key=val2")
110                 .body(Default::default())
111                 .unwrap()
112         } else {
113             assert_eq!(req.uri(), "/3");
114             assert_eq!(req.headers()["cookie"], "key=val2");
115             http::Response::default()
116         }
117     });
118 
119     let client = reqwest::Client::builder()
120         .cookie_store(true)
121         .build()
122         .unwrap();
123 
124     let url = format!("http://{}/", server.addr());
125     client.get(&url).send().await.unwrap();
126 
127     let url = format!("http://{}/2", server.addr());
128     client.get(&url).send().await.unwrap();
129 
130     let url = format!("http://{}/3", server.addr());
131     client.get(&url).send().await.unwrap();
132 }
133 
134 #[tokio::test]
cookie_store_max_age()135 async fn cookie_store_max_age() {
136     let server = server::http(move |req| async move {
137         assert_eq!(req.headers().get("cookie"), None);
138         http::Response::builder()
139             .header("Set-Cookie", "key=val; Max-Age=0")
140             .body(Default::default())
141             .unwrap()
142     });
143 
144     let client = reqwest::Client::builder()
145         .cookie_store(true)
146         .build()
147         .unwrap();
148     let url = format!("http://{}/", server.addr());
149     client.get(&url).send().await.unwrap();
150     client.get(&url).send().await.unwrap();
151 }
152 
153 #[tokio::test]
cookie_store_expires()154 async fn cookie_store_expires() {
155     let server = server::http(move |req| async move {
156         assert_eq!(req.headers().get("cookie"), None);
157         http::Response::builder()
158             .header(
159                 "Set-Cookie",
160                 "key=val; Expires=Wed, 21 Oct 2015 07:28:00 GMT",
161             )
162             .body(Default::default())
163             .unwrap()
164     });
165 
166     let client = reqwest::Client::builder()
167         .cookie_store(true)
168         .build()
169         .unwrap();
170 
171     let url = format!("http://{}/", server.addr());
172     client.get(&url).send().await.unwrap();
173     client.get(&url).send().await.unwrap();
174 }
175 
176 #[tokio::test]
cookie_store_path()177 async fn cookie_store_path() {
178     let server = server::http(move |req| async move {
179         if req.uri() == "/" {
180             assert_eq!(req.headers().get("cookie"), None);
181             http::Response::builder()
182                 .header("Set-Cookie", "key=val; Path=/subpath")
183                 .body(Default::default())
184                 .unwrap()
185         } else {
186             assert_eq!(req.uri(), "/subpath");
187             assert_eq!(req.headers()["cookie"], "key=val");
188             http::Response::default()
189         }
190     });
191 
192     let client = reqwest::Client::builder()
193         .cookie_store(true)
194         .build()
195         .unwrap();
196 
197     let url = format!("http://{}/", server.addr());
198     client.get(&url).send().await.unwrap();
199     client.get(&url).send().await.unwrap();
200 
201     let url = format!("http://{}/subpath", server.addr());
202     client.get(&url).send().await.unwrap();
203 }
204