Merge pull request #373 from jbr/x-forwarded-host

add support for x-forwarded-host to proxies::Forwarded
This commit is contained in:
Jeremiah Senkpiel 2021-07-21 10:24:37 -07:00 committed by GitHub
commit affaf3fcf2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 3 deletions

View File

@ -8,6 +8,7 @@ use std::{borrow::Cow, convert::TryFrom, fmt::Write, net::IpAddr};
const X_FORWARDED_FOR: HeaderName = HeaderName::from_lowercase_str("x-forwarded-for");
const X_FORWARDED_PROTO: HeaderName = HeaderName::from_lowercase_str("x-forwarded-proto");
const X_FORWARDED_BY: HeaderName = HeaderName::from_lowercase_str("x-forwarded-by");
const X_FORWARDED_HOST: HeaderName = HeaderName::from_lowercase_str("x-forwarded-host");
/// A rust representation of the [forwarded
/// header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Forwarded).
@ -169,12 +170,16 @@ impl<'a> Forwarded<'a> {
.get(X_FORWARDED_PROTO)
.map(|p| Cow::Borrowed(p.as_str()));
if !forwarded_for.is_empty() || by.is_some() || proto.is_some() {
let host = headers
.get(X_FORWARDED_HOST)
.map(|h| Cow::Borrowed(h.as_str()));
if !forwarded_for.is_empty() || by.is_some() || proto.is_some() || host.is_some() {
Ok(Some(Self {
forwarded_for,
by,
proto,
host: None,
host,
}))
} else {
Ok(None)
@ -569,10 +574,11 @@ mod tests {
let mut request = Request::new(Get, Url::parse("http://_/")?);
request.append_header(X_FORWARDED_FOR, "192.0.2.43, 2001:db8:cafe::17");
request.append_header(X_FORWARDED_PROTO, "gopher");
request.append_header(X_FORWARDED_HOST, "example.com");
let forwarded = Forwarded::from_headers(&request)?.unwrap();
assert_eq!(
forwarded.to_string(),
r#"for=192.0.2.43, for="[2001:db8:cafe::17]";proto=gopher"#
r#"for=192.0.2.43, for="[2001:db8:cafe::17]";host=example.com;proto=gopher"#
);
Ok(())
}