use http::Uri;
use url::Url;
use crate::TowerError;
pub(crate) fn validate_origin(
origin: &Url,
allow_insecure_loopback: bool,
) -> Result<(), TowerError> {
let secure = origin.scheme() == "https";
let loopback = allow_insecure_loopback
&& origin.scheme() == "http"
&& origin.host_str().is_some_and(aep_core::is_loopback_host);
if (!secure && !loopback)
|| origin.host_str().is_none()
|| !origin.username().is_empty()
|| origin.password().is_some()
|| origin.path() != "/"
|| origin.query().is_some()
|| origin.fragment().is_some()
{
return Err(TowerError::InvalidConfiguration(
"protected-resource origin must be an HTTPS origin".to_owned(),
));
}
Ok(())
}
pub(crate) fn request_url(origin: &Url, uri: &Uri) -> Url {
let mut url = origin.clone();
url.set_path(uri.path());
url.set_query(uri.query());
url
}