@@ -8,6 +8,7 @@ use std::{borrow::Cow, convert::TryFrom, fmt::Write, net::IpAddr};
8
8
const X_FORWARDED_FOR : HeaderName = HeaderName :: from_lowercase_str ( "x-forwarded-for" ) ;
9
9
const X_FORWARDED_PROTO : HeaderName = HeaderName :: from_lowercase_str ( "x-forwarded-proto" ) ;
10
10
const X_FORWARDED_BY : HeaderName = HeaderName :: from_lowercase_str ( "x-forwarded-by" ) ;
11
+ const X_FORWARDED_HOST : HeaderName = HeaderName :: from_lowercase_str ( "x-forwarded-host" ) ;
11
12
12
13
/// A rust representation of the [forwarded
13
14
/// header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Forwarded).
@@ -169,12 +170,16 @@ impl<'a> Forwarded<'a> {
169
170
. get ( X_FORWARDED_PROTO )
170
171
. map ( |p| Cow :: Borrowed ( p. as_str ( ) ) ) ;
171
172
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 ( ) {
173
178
Ok ( Some ( Self {
174
179
forwarded_for,
175
180
by,
176
181
proto,
177
- host : None ,
182
+ host,
178
183
} ) )
179
184
} else {
180
185
Ok ( None )
@@ -569,10 +574,11 @@ mod tests {
569
574
let mut request = Request :: new ( Get , Url :: parse ( "http://_/" ) ?) ;
570
575
request. append_header ( X_FORWARDED_FOR , "192.0.2.43, 2001:db8:cafe::17" ) ;
571
576
request. append_header ( X_FORWARDED_PROTO , "gopher" ) ;
577
+ request. append_header ( X_FORWARDED_HOST , "example.com" ) ;
572
578
let forwarded = Forwarded :: from_headers ( & request) ?. unwrap ( ) ;
573
579
assert_eq ! (
574
580
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"#
576
582
) ;
577
583
Ok ( ( ) )
578
584
}
0 commit comments