use hyper::Request; /// Extract the effective request host for routing and scoped ACL checks. /// /// Prefer the explicit `Host` header when present, otherwise fall back to the /// URI authority used by HTTP/2 and HTTP/3 requests. pub(crate) fn extract_request_host(req: &Request) -> Option<&str> { req.headers() .get("host") .and_then(|value| value.to_str().ok()) .map(|host| host.split(':').next().unwrap_or(host)) .or_else(|| req.uri().host()) } #[cfg(test)] mod tests { use bytes::Bytes; use http_body_util::Empty; use hyper::Request; use super::extract_request_host; #[test] fn extracts_host_header_before_uri_authority() { let req = Request::builder() .uri("https://uri.abc.xyz/test") .header("host", "header.abc.xyz:443") .body(Empty::::new()) .unwrap(); assert_eq!(extract_request_host(&req), Some("header.abc.xyz")); } #[test] fn falls_back_to_uri_authority_when_host_header_missing() { let req = Request::builder() .uri("https://outline.abc.xyz/test") .body(Empty::::new()) .unwrap(); assert_eq!(extract_request_host(&req), Some("outline.abc.xyz")); } }