use http::Request;
use hyper::Body;
pub fn set_cluster_url(req: Request<Body>, url: &url::Url) -> Request<Body> {
let (mut parts, body) = req.into_parts();
let pandq = parts.uri.path_and_query().expect("valid path+query from kube");
parts.uri = finalize_url(url, &pandq).parse().expect("valid URL");
Request::from_parts(parts, body)
}
fn finalize_url(cluster_url: &url::Url, request_pandq: &http::uri::PathAndQuery) -> String {
let base = cluster_url.as_str().trim_end_matches('/'); format!("{}{}", base, request_pandq)
}
#[cfg(test)]
mod tests {
#[test]
fn normal_host() {
let minikube_host = "https://192.168.1.65:8443";
let cluster_url = url::Url::parse(minikube_host).unwrap();
let apipath: http::Uri = "/api/v1/nodes?hi=yes".parse().unwrap();
let pandq = apipath.path_and_query().expect("could pandq apipath");
let final_url = super::finalize_url(&cluster_url, &pandq);
assert_eq!(
final_url.as_str(),
"https://192.168.1.65:8443/api/v1/nodes?hi=yes"
);
}
#[test]
fn rancher_host() {
let rancher_host = "https://hostname/foo/bar";
let cluster_url = url::Url::parse(rancher_host).unwrap();
assert_eq!(cluster_url.host_str().unwrap(), "hostname");
assert_eq!(cluster_url.path(), "/foo/bar");
assert_eq!(cluster_url.join("/api/v1/nodes").unwrap().path(), "/api/v1/nodes");
let apipath: http::Uri = "/api/v1/nodes?hi=yes".parse().unwrap();
let pandq = apipath.path_and_query().expect("could pandq apipath");
let final_url = super::finalize_url(&cluster_url, &pandq);
assert_eq!(final_url.as_str(), "https://hostname/foo/bar/api/v1/nodes?hi=yes");
}
}