@@ -8,6 +8,7 @@ use std::{borrow::Cow, convert::TryFrom, fmt::Write, net::IpAddr};
88const X_FORWARDED_FOR : HeaderName = HeaderName :: from_lowercase_str ( "x-forwarded-for" ) ;
99const X_FORWARDED_PROTO : HeaderName = HeaderName :: from_lowercase_str ( "x-forwarded-proto" ) ;
1010const X_FORWARDED_BY : HeaderName = HeaderName :: from_lowercase_str ( "x-forwarded-by" ) ;
11+ const X_FORWARDED_HOST : HeaderName = HeaderName :: from_lowercase_str ( "x-forwarded-host" ) ;
1112
1213/// A rust representation of the [forwarded
1314/// header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Forwarded).
@@ -169,12 +170,16 @@ impl<'a> Forwarded<'a> {
169170 . get ( X_FORWARDED_PROTO )
170171 . map ( |p| Cow :: Borrowed ( p. as_str ( ) ) ) ;
171172
172- if !forwarded_for. is_empty ( ) || by. is_some ( ) || proto. is_some ( ) {
173+ let host = headers
174+ . get ( X_FORWARDED_HOST )
175+ . map ( |h| Cow :: Borrowed ( h. as_str ( ) ) ) ;
176+
177+ if !forwarded_for. is_empty ( ) || by. is_some ( ) || proto. is_some ( ) || host. is_some ( ) {
173178 Ok ( Some ( Self {
174179 forwarded_for,
175180 by,
176181 proto,
177- host : None ,
182+ host,
178183 } ) )
179184 } else {
180185 Ok ( None )
@@ -569,10 +574,11 @@ mod tests {
569574 let mut request = Request :: new ( Get , Url :: parse ( "http://_/" ) ?) ;
570575 request. append_header ( X_FORWARDED_FOR , "192.0.2.43, 2001:db8:cafe::17" ) ;
571576 request. append_header ( X_FORWARDED_PROTO , "gopher" ) ;
577+ request. append_header ( X_FORWARDED_HOST , "example.com" ) ;
572578 let forwarded = Forwarded :: from_headers ( & request) ?. unwrap ( ) ;
573579 assert_eq ! (
574580 forwarded. to_string( ) ,
575- r#"for=192.0.2.43, for="[2001:db8:cafe::17]";proto=gopher"#
581+ r#"for=192.0.2.43, for="[2001:db8:cafe::17]";host=example.com; proto=gopher"#
576582 ) ;
577583 Ok ( ( ) )
578584 }
0 commit comments