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