Skip to content
Clone
26af08e
47 lines 1.3 KB Rust
use config::session::{SameSite, SessionConfig};
pub fn read_cookie<'a>(cookie_header: &'a str, name: &str) -> Option<&'a str> {
cookie_header.split(';').find_map(|pair| {
let (key, value) = pair.split_once('=')?;
if key.trim() == name {
Some(value.trim())
} else {
None
}
})
}
pub fn clear_session_cookie(config: &SessionConfig) -> String {
build(config, "", 0)
}
pub fn session_cookie(config: &SessionConfig, value: &str, max_age_secs: i64) -> String {
build(config, value, max_age_secs)
}
fn build(config: &SessionConfig, value: &str, max_age_secs: i64) -> String {
let mut cookie = format!(
"{}={value}; Max-Age={max_age_secs}; HttpOnly",
config.cookie_name
);
if let Some(path) = &config.path {
cookie.push_str("; Path=");
cookie.push_str(path);
}
if let Some(domain) = &config.domain {
if !domain.is_empty() {
cookie.push_str("; Domain=");
cookie.push_str(domain);
}
}
if config.secure || matches!(config.same_site, SameSite::None) {
cookie.push_str("; Secure");
}
cookie.push_str("; SameSite=");
cookie.push_str(match config.same_site {
SameSite::Strict => "Strict",
SameSite::Lax => "Lax",
SameSite::None => "None",
});
cookie
}