@@ -22,8 +22,9 @@ use crate::logger::{IncMetric, METRICS};
22
22
use crate :: mmds:: data_store:: { Mmds , MmdsDatastoreError as MmdsError , MmdsVersion , OutputFormat } ;
23
23
use crate :: mmds:: token:: PATH_TO_TOKEN ;
24
24
use crate :: mmds:: token_headers:: {
25
- REJECTED_HEADER , X_AWS_EC2_METADATA_TOKEN_HEADER , X_AWS_EC2_METADATA_TOKEN_SSL_SECONDS_HEADER ,
26
- X_METADATA_TOKEN_HEADER , X_METADATA_TOKEN_TTL_SECONDS_HEADER , get_header_value_pair,
25
+ X_AWS_EC2_METADATA_TOKEN_HEADER , X_AWS_EC2_METADATA_TOKEN_SSL_SECONDS_HEADER ,
26
+ X_FORWARDED_FOR_HEADER , X_METADATA_TOKEN_HEADER , X_METADATA_TOKEN_TTL_SECONDS_HEADER ,
27
+ get_header_value_pair,
27
28
} ;
28
29
29
30
#[ rustfmt:: skip]
@@ -242,11 +243,10 @@ fn respond_to_put_request(mmds: &mut Mmds, request: Request) -> Response {
242
243
let custom_headers = request. headers . custom_entries ( ) ;
243
244
244
245
// Reject `PUT` requests that contain `X-Forwarded-For` header.
245
- if custom_headers. contains_key ( REJECTED_HEADER ) {
246
- let error_msg = RequestError :: HeaderError ( HttpHeaderError :: UnsupportedName (
247
- REJECTED_HEADER . to_string ( ) ,
248
- ) )
249
- . to_string ( ) ;
246
+ if let Some ( ( header, _) ) = get_header_value_pair ( custom_headers, & [ X_FORWARDED_FOR_HEADER ] ) {
247
+ let error_msg =
248
+ RequestError :: HeaderError ( HttpHeaderError :: UnsupportedName ( header. to_string ( ) ) )
249
+ . to_string ( ) ;
250
250
return build_response (
251
251
request. http_version ( ) ,
252
252
StatusCode :: BadRequest ,
@@ -754,19 +754,25 @@ mod tests {
754
754
assert_eq ! ( actual_response. content_type( ) , MediaType :: PlainText ) ;
755
755
756
756
// Test unsupported `X-Forwarded-For` header
757
- let request = Request :: try_from (
758
- b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r \n \
759
- X-Forwarded-For: 203.0.113.195\r \n \r \n ",
760
- None ,
761
- )
762
- . unwrap ( ) ;
763
- let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: BadRequest ) ;
764
- expected_response. set_content_type ( MediaType :: PlainText ) ;
765
- expected_response. set_body ( Body :: new (
766
- "Invalid header. Reason: Unsupported header name. Key: X-Forwarded-For" . to_string ( ) ,
767
- ) ) ;
768
- let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
769
- assert_eq ! ( actual_response, expected_response) ;
757
+ for header in [ "X-Forwarded-For" , "x-forwarded-for" , "X-fOrWaRdEd-FoR" ] {
758
+ #[ rustfmt:: skip]
759
+ let request = Request :: try_from (
760
+ format ! (
761
+ "PUT http://169.254.169.254/latest/api/token HTTP/1.0\r \n \
762
+ {header}: 203.0.113.195\r \n \r \n "
763
+ )
764
+ . as_bytes ( ) ,
765
+ None ,
766
+ )
767
+ . unwrap ( ) ;
768
+ let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: BadRequest ) ;
769
+ expected_response. set_content_type ( MediaType :: PlainText ) ;
770
+ expected_response. set_body ( Body :: new ( format ! (
771
+ "Invalid header. Reason: Unsupported header name. Key: {header}"
772
+ ) ) ) ;
773
+ let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
774
+ assert_eq ! ( actual_response, expected_response) ;
775
+ }
770
776
771
777
// Test invalid path
772
778
let request = Request :: try_from (
0 commit comments