use http::uri::Scheme;
use crate::Request;
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum SecureCookiePolicy {
Always,
Never,
#[default]
AutoFromScheme,
}
impl SecureCookiePolicy {
#[inline]
#[must_use]
pub fn from_bool(secure: bool) -> Self {
if secure { Self::Always } else { Self::Never }
}
#[inline]
#[must_use]
pub fn is_secure(self, req: &Request) -> bool {
match self {
Self::Always => true,
Self::Never => false,
Self::AutoFromScheme => req.scheme() == &Scheme::HTTPS,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test::TestClient;
#[test]
fn secure_cookie_policy_from_bool_uses_fixed_policy() {
assert_eq!(
SecureCookiePolicy::from_bool(true),
SecureCookiePolicy::Always
);
assert_eq!(
SecureCookiePolicy::from_bool(false),
SecureCookiePolicy::Never
);
}
#[test]
fn secure_cookie_policy_resolves_from_scheme() {
let http_req = TestClient::get("http://example.com/").build();
let https_req = TestClient::get("https://example.com/").build();
assert!(!SecureCookiePolicy::AutoFromScheme.is_secure(&http_req));
assert!(SecureCookiePolicy::AutoFromScheme.is_secure(&https_req));
}
#[test]
fn secure_cookie_policy_uses_recorded_scheme_when_uri_has_no_scheme() {
let hyper_req = http::Request::builder()
.uri("/")
.body(crate::http::ReqBody::None)
.expect("build request");
let req = Request::from_hyper(hyper_req, Scheme::HTTPS);
assert_eq!(req.uri().scheme(), None);
assert!(SecureCookiePolicy::AutoFromScheme.is_secure(&req));
}
}