requiem_http/cookie/
draft.rs

1//! This module contains types that represent cookie properties that are not yet
2//! standardized. That is, _draft_ features.
3
4use std::fmt;
5
6/// The `SameSite` cookie attribute.
7///
8/// A cookie with a `SameSite` attribute is imposed restrictions on when it is
9/// sent to the origin server in a cross-site request. If the `SameSite`
10/// attribute is "Strict", then the cookie is never sent in cross-site requests.
11/// If the `SameSite` attribute is "Lax", the cookie is only sent in cross-site
12/// requests with "safe" HTTP methods, i.e, `GET`, `HEAD`, `OPTIONS`, `TRACE`.
13/// If the `SameSite` attribute is not present (made explicit via the
14/// `SameSite::None` variant), then the cookie will be sent as normal.
15///
16/// **Note:** This cookie attribute is an HTTP draft! Its meaning and definition
17/// are subject to change.
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
19pub enum SameSite {
20    /// The "Strict" `SameSite` attribute.
21    Strict,
22    /// The "Lax" `SameSite` attribute.
23    Lax,
24    /// No `SameSite` attribute.
25    None,
26}
27
28impl SameSite {
29    /// Returns `true` if `self` is `SameSite::Strict` and `false` otherwise.
30    ///
31    /// # Example
32    ///
33    /// ```rust
34    /// use requiem_http::cookie::SameSite;
35    ///
36    /// let strict = SameSite::Strict;
37    /// assert!(strict.is_strict());
38    /// assert!(!strict.is_lax());
39    /// assert!(!strict.is_none());
40    /// ```
41    #[inline]
42    pub fn is_strict(self) -> bool {
43        match self {
44            SameSite::Strict => true,
45            SameSite::Lax | SameSite::None => false,
46        }
47    }
48
49    /// Returns `true` if `self` is `SameSite::Lax` and `false` otherwise.
50    ///
51    /// # Example
52    ///
53    /// ```rust
54    /// use requiem_http::cookie::SameSite;
55    ///
56    /// let lax = SameSite::Lax;
57    /// assert!(lax.is_lax());
58    /// assert!(!lax.is_strict());
59    /// assert!(!lax.is_none());
60    /// ```
61    #[inline]
62    pub fn is_lax(self) -> bool {
63        match self {
64            SameSite::Lax => true,
65            SameSite::Strict | SameSite::None => false,
66        }
67    }
68
69    /// Returns `true` if `self` is `SameSite::None` and `false` otherwise.
70    ///
71    /// # Example
72    ///
73    /// ```rust
74    /// use requiem_http::cookie::SameSite;
75    ///
76    /// let none = SameSite::None;
77    /// assert!(none.is_none());
78    /// assert!(!none.is_lax());
79    /// assert!(!none.is_strict());
80    /// ```
81    #[inline]
82    pub fn is_none(self) -> bool {
83        match self {
84            SameSite::None => true,
85            SameSite::Lax | SameSite::Strict => false,
86        }
87    }
88}
89
90impl fmt::Display for SameSite {
91    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
92        match *self {
93            SameSite::Strict => write!(f, "Strict"),
94            SameSite::Lax => write!(f, "Lax"),
95            SameSite::None => Ok(()),
96        }
97    }
98}