use pingora::http::RequestHeader;
const AUTH_HEADERS: &[&str] = &[
"authorization",
"x-api-key",
"x-auth-token",
"x-access-token",
];
const SESSION_COOKIES: &[&str] = &[
"session",
"sessionid",
"sid",
"token",
"access_token",
"auth",
];
pub fn has_auth_header(headers: &RequestHeader) -> bool {
for header_name in AUTH_HEADERS {
if headers.headers.get(*header_name).is_some() {
return true;
}
}
if let Some(cookie_header) = headers.headers.get("cookie") {
if let Ok(cookie_str) = cookie_header.to_str() {
let cookie_lower = cookie_str.to_lowercase();
for session_name in SESSION_COOKIES {
if cookie_lower.contains(session_name) {
return true;
}
}
}
}
false
}
#[cfg(test)]
mod tests {
use super::*;
use pingora::http::RequestHeader;
fn make_headers(pairs: &[(&'static str, &'static str)]) -> RequestHeader {
let mut headers = RequestHeader::build("GET", b"/", None).unwrap();
for (name, value) in pairs {
headers.insert_header(*name, *value).unwrap();
}
headers
}
#[test]
fn test_bearer_token() {
let headers = make_headers(&[("authorization", "Bearer xyz123")]);
assert!(has_auth_header(&headers));
}
#[test]
fn test_api_key() {
let headers = make_headers(&[("x-api-key", "sk-test-123")]);
assert!(has_auth_header(&headers));
}
#[test]
fn test_session_cookie() {
let headers = make_headers(&[("cookie", "sessionid=abc123; other=value")]);
assert!(has_auth_header(&headers));
}
#[test]
fn test_no_auth() {
let headers = make_headers(&[("content-type", "application/json")]);
assert!(!has_auth_header(&headers));
}
#[test]
fn test_unrelated_cookie() {
let headers = make_headers(&[("cookie", "theme=dark; lang=en")]);
assert!(!has_auth_header(&headers));
}
}