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 }