volo_http/utils/cookie/
jar.rs1use std::{convert::Infallible, ops::Deref};
6
7use cookie::Cookie;
8use http::{HeaderMap, header, request::Parts};
9
10use crate::context::ServerContext;
11#[cfg(feature = "server")]
12use crate::server::extract::FromContext;
13
14pub struct CookieJar {
16 inner: cookie::CookieJar,
17}
18
19impl CookieJar {
20 pub fn from_header(headers: &HeaderMap) -> Self {
22 let mut jar = cookie::CookieJar::new();
23 for cookie in headers
24 .get_all(header::COOKIE)
25 .into_iter()
26 .filter_map(|val| val.to_str().ok())
27 .flat_map(|val| val.split(';'))
28 .filter_map(|cookie| Cookie::parse_encoded(cookie.to_owned()).ok())
29 {
30 jar.add_original(cookie);
31 }
32
33 Self { inner: jar }
34 }
35}
36
37impl Deref for CookieJar {
38 type Target = cookie::CookieJar;
39
40 fn deref(&self) -> &Self::Target {
41 &self.inner
42 }
43}
44
45#[cfg(feature = "server")]
46impl FromContext for CookieJar {
47 type Rejection = Infallible;
48
49 async fn from_context(
50 _cx: &mut ServerContext,
51 parts: &mut Parts,
52 ) -> Result<Self, Self::Rejection> {
53 Ok(Self::from_header(&parts.headers))
54 }
55}