use http::HeaderMap;
pub fn is_websocket_upgrade(headers: &HeaderMap) -> bool {
let has_upgrade_connection = headers
.get(http::header::CONNECTION)
.and_then(|value| value.to_str().ok())
.map(|value| {
value
.split(',')
.any(|token| token.trim().eq_ignore_ascii_case("upgrade"))
})
.unwrap_or(false);
let has_websocket_upgrade = headers
.get(http::header::UPGRADE)
.and_then(|value| value.to_str().ok())
.map(|value| value.eq_ignore_ascii_case("websocket"))
.unwrap_or(false);
has_upgrade_connection && has_websocket_upgrade
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn detects_websocket_upgrade() {
let mut headers = HeaderMap::new();
headers.insert(http::header::CONNECTION, "Upgrade".parse().unwrap());
headers.insert(http::header::UPGRADE, "websocket".parse().unwrap());
assert!(is_websocket_upgrade(&headers));
}
}