volo_http/utils/cookie/
jar.rs

1//! Cookie utilities of Volo-HTTP.
2//!
3//! [`CookieJar`] currently only supports the server side.
4
5use 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
14/// A cooke jar that can be extracted from a handler.
15pub struct CookieJar {
16    inner: cookie::CookieJar,
17}
18
19impl CookieJar {
20    /// Create a [`CookieJar`] from given [`HeaderMap`]
21    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}