use reqwest::header::{HOST, HeaderValue};
pub(crate) const MANAGED_MARKER_HEADER: &str = "NYM-INTERNAL-MANAGED-HOST";
const UNSET: &str = "unset";
fn effective(r: &reqwest::Request) -> Option<&HeaderValue> {
r.headers().get_all(HOST).iter().next_back()
}
pub(crate) fn overridden_by_caller(r: &reqwest::Request) -> bool {
let current = effective(r).and_then(|v| v.to_str().ok());
let last_managed = r
.headers()
.get(MANAGED_MARKER_HEADER)
.and_then(|v| v.to_str().ok())
.filter(|marker| *marker != UNSET);
current != last_managed
}
pub(crate) fn set(r: &mut reqwest::Request, host: Option<&str>) {
r.headers_mut().remove(HOST);
if let Some(value) = host.and_then(|h| HeaderValue::from_str(h).ok()) {
r.headers_mut().insert(HOST, value);
}
if let Ok(marker) = HeaderValue::from_str(host.unwrap_or(UNSET)) {
r.headers_mut().insert(MANAGED_MARKER_HEADER, marker);
}
}
pub(crate) fn collapse_override(r: &mut reqwest::Request) {
if let Some(value) = effective(r).cloned() {
r.headers_mut().remove(HOST);
r.headers_mut().insert(HOST, value);
}
}