use std::convert::TryFrom;
use http::uri::{self, Authority, Scheme, Uri};
use hyper::Request;
pub trait RequestExt {
fn scheme(&self) -> Option<Scheme>;
fn authority(&self) -> Option<Authority>;
fn base_uri(&self) -> uri::Builder {
Uri::builder()
.scheme(self.scheme().unwrap_or(Scheme::HTTP))
.authority(
self.authority()
.unwrap_or_else(|| Authority::from_static("localhost")),
)
}
}
impl<B> RequestExt for Request<B> {
fn scheme(&self) -> Option<Scheme> {
self.headers()
.get("X-Forwarded-Proto")
.or_else(|| self.headers().get(":scheme"))
.and_then(|scheme| Scheme::try_from(scheme.as_bytes()).ok())
}
fn authority(&self) -> Option<Authority> {
self.headers()
.get("X-Forwarded-Host")
.or_else(|| self.headers().get(":authority"))
.or_else(|| self.headers().get("Host"))
.and_then(|authority| {
Authority::try_from(authority.as_bytes()).ok()
})
}
}