44 lines
1.3 KiB
Rust
44 lines
1.3 KiB
Rust
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<B>(req: &Request<B>) -> 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::<Bytes>::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::<Bytes>::new())
|
|
.unwrap();
|
|
|
|
assert_eq!(extract_request_host(&req), Some("outline.abc.xyz"));
|
|
}
|
|
}
|