@@ -485,8 +485,9 @@ mod tests {
485485 ) ;
486486
487487 // Test resource not found.
488- let request_bytes = b"GET http://169.254.169.254/invalid HTTP/1.0\r \n \r \n " ;
489- let request = Request :: try_from ( request_bytes, None ) . unwrap ( ) ;
488+ let request =
489+ Request :: try_from ( b"GET http://169.254.169.254/invalid HTTP/1.0\r \n \r \n " , None )
490+ . unwrap ( ) ;
490491 let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: NotFound ) ;
491492 expected_response. set_content_type ( MediaType :: PlainText ) ;
492493 expected_response. set_body ( Body :: new (
@@ -496,8 +497,7 @@ mod tests {
496497 assert_eq ! ( actual_response, expected_response) ;
497498
498499 // Test NotImplemented.
499- let request_bytes = b"GET /age HTTP/1.1\r \n \r \n " ;
500- let request = Request :: try_from ( request_bytes, None ) . unwrap ( ) ;
500+ let request = Request :: try_from ( b"GET /age HTTP/1.1\r \n \r \n " , None ) . unwrap ( ) ;
501501 let mut expected_response = Response :: new ( Version :: Http11 , StatusCode :: NotImplemented ) ;
502502 expected_response. set_content_type ( MediaType :: PlainText ) ;
503503 let body = "Cannot retrieve value. The value has an unsupported type." . to_string ( ) ;
@@ -508,8 +508,11 @@ mod tests {
508508 // Test not allowed HTTP Method.
509509 let not_allowed_methods = [ "PUT" , "PATCH" ] ;
510510 for method in not_allowed_methods. iter ( ) {
511- let request_bytes = format ! ( "{} http://169.254.169.255/ HTTP/1.0\r \n \r \n " , method) ;
512- let request = Request :: try_from ( request_bytes. as_bytes ( ) , None ) . unwrap ( ) ;
511+ let request = Request :: try_from (
512+ format ! ( "{} http://169.254.169.255/ HTTP/1.0\r \n \r \n " , method) . as_bytes ( ) ,
513+ None ,
514+ )
515+ . unwrap ( ) ;
513516 let mut expected_response =
514517 Response :: new ( Version :: Http10 , StatusCode :: MethodNotAllowed ) ;
515518 expected_response. set_content_type ( MediaType :: PlainText ) ;
@@ -520,32 +523,29 @@ mod tests {
520523 }
521524
522525 // Test invalid (empty absolute path) URI.
523- let request_bytes = b"GET http:// HTTP/1.0\r \n \r \n " ;
524- let request = Request :: try_from ( request_bytes, None ) . unwrap ( ) ;
526+ let request = Request :: try_from ( b"GET http:// HTTP/1.0\r \n \r \n " , None ) . unwrap ( ) ;
525527 let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: BadRequest ) ;
526528 expected_response. set_content_type ( MediaType :: PlainText ) ;
527529 expected_response. set_body ( Body :: new ( VmmMmdsError :: InvalidURI . to_string ( ) ) ) ;
528530 let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
529531 assert_eq ! ( actual_response, expected_response) ;
530532
531533 // Test invalid custom header value is ignored when V1 is configured.
532- let request_bytes = b"GET http://169.254.169.254/name/first HTTP/1.0 \r \n \
533- Accept: application/json \r \n
534- X-metadata-token-ttl-seconds : application/json\r \n \r \n " ;
535- let request = Request :: try_from ( request_bytes , None ) . unwrap ( ) ;
536- let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: OK ) ;
537- expected_response . set_body ( Body :: new ( " \" John \" " ) ) ;
534+ let ( request , expected_response ) = generate_request_and_expected_response (
535+ b"GET http://169.254.169.254/ HTTP/1.0 \r \n \
536+ Accept : application/json\r \n \
537+ X-metadata-token-ttl-seconds: -60 \r \n \r \n " ,
538+ MediaType :: ApplicationJson ,
539+ ) ;
538540 let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
539541 assert_eq ! ( actual_response, expected_response) ;
540542
541543 // Test Ok path.
542- let request_bytes = b"GET http://169.254.169.254/ HTTP/1.0\r \n \
543- Accept: application/json\r \n \r \n ";
544- let request = Request :: try_from ( request_bytes, None ) . unwrap ( ) ;
545- let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: OK ) ;
546- let mut body = get_json_data ( ) . to_string ( ) ;
547- body. retain ( |c| !c. is_whitespace ( ) ) ;
548- expected_response. set_body ( Body :: new ( body) ) ;
544+ let ( request, expected_response) = generate_request_and_expected_response (
545+ b"GET http://169.254.169.254/ HTTP/1.0\r \n \
546+ Accept: application/json\r \n \r \n ",
547+ MediaType :: ApplicationJson ,
548+ ) ;
549549 let actual_response = convert_to_response ( mmds, request) ;
550550 assert_eq ! ( actual_response, expected_response) ;
551551 }
@@ -566,8 +566,8 @@ mod tests {
566566 ) ;
567567
568568 // Test not allowed PATCH HTTP Method.
569- let request_bytes = b"PATCH http://169.254.169.255/ HTTP/1.0 \r \n \r \n " ;
570- let request = Request :: try_from ( request_bytes , None ) . unwrap ( ) ;
569+ let request =
570+ Request :: try_from ( b"PATCH http://169.254.169.255/ HTTP/1.0 \r \n \r \n " , None ) . unwrap ( ) ;
571571 let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: MethodNotAllowed ) ;
572572 expected_response. set_content_type ( MediaType :: PlainText ) ;
573573 expected_response. set_body ( Body :: new ( VmmMmdsError :: MethodNotAllowed . to_string ( ) ) ) ;
@@ -577,25 +577,30 @@ mod tests {
577577 assert_eq ! ( actual_response, expected_response) ;
578578
579579 // Test invalid value for custom header.
580- let request_bytes = b"GET http://169.254.169.254/ HTTP/1.0\r \n \
581- Accept: application/json\r \n
582- X-metadata-token-ttl-seconds: application/json\r \n \r \n " ;
583- let request = Request :: try_from ( request_bytes, None ) . unwrap ( ) ;
580+ let request = Request :: try_from (
581+ b"GET http://169.254.169.254/ HTTP/1.0\r \n \
582+ Accept: application/json\r \n \
583+ X-metadata-token-ttl-seconds: -60\r \n \r \n ",
584+ None ,
585+ )
586+ . unwrap ( ) ;
584587 let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: BadRequest ) ;
585588 expected_response. set_content_type ( MediaType :: PlainText ) ;
586589 expected_response. set_body ( Body :: new (
587- "Invalid header. Reason: Invalid value. Key:X-metadata-token-ttl-seconds; \
588- Value:application/json"
590+ "Invalid header. Reason: Invalid value. Key:X-metadata-token-ttl-seconds; Value:-60"
589591 . to_string ( ) ,
590592 ) ) ;
591593 let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
592594 assert_eq ! ( actual_response, expected_response) ;
593595
594596 // Test PUT requests.
595597 // Unsupported `X-Forwarded-For` header present.
596- let request_bytes = b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r \n \
597- X-Forwarded-For: 203.0.113.195\r \n \r \n ";
598- let request = Request :: try_from ( request_bytes, None ) . unwrap ( ) ;
598+ let request = Request :: try_from (
599+ b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r \n \
600+ X-Forwarded-For: 203.0.113.195\r \n \r \n ",
601+ None ,
602+ )
603+ . unwrap ( ) ;
599604 let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: BadRequest ) ;
600605 expected_response. set_content_type ( MediaType :: PlainText ) ;
601606 expected_response. set_body ( Body :: new (
@@ -605,9 +610,12 @@ mod tests {
605610 assert_eq ! ( actual_response, expected_response) ;
606611
607612 // Test invalid path.
608- let request_bytes = b"PUT http://169.254.169.254/token HTTP/1.0\r \n \
609- X-metadata-token-ttl-seconds: 60\r \n \r \n ";
610- let request = Request :: try_from ( request_bytes, None ) . unwrap ( ) ;
613+ let request = Request :: try_from (
614+ b"PUT http://169.254.169.254/token HTTP/1.0\r \n \
615+ X-metadata-token-ttl-seconds: 60\r \n \r \n ",
616+ None ,
617+ )
618+ . unwrap ( ) ;
611619 let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: NotFound ) ;
612620 expected_response. set_content_type ( MediaType :: PlainText ) ;
613621 expected_response. set_body ( Body :: new (
@@ -619,12 +627,16 @@ mod tests {
619627 // Test invalid lifetime values for token.
620628 let invalid_values = [ MIN_TOKEN_TTL_SECONDS - 1 , MAX_TOKEN_TTL_SECONDS + 1 ] ;
621629 for invalid_value in invalid_values. iter ( ) {
622- let request_bytes = format ! (
623- "PUT http://169.254.169.254/latest/api/token \
624- HTTP/1.0\r \n X-metadata-token-ttl-seconds: {}\r \n \r \n ",
625- invalid_value
626- ) ;
627- let request = Request :: try_from ( request_bytes. as_bytes ( ) , None ) . unwrap ( ) ;
630+ let request = Request :: try_from (
631+ format ! (
632+ "PUT http://169.254.169.254/latest/api/token HTTP/1.0\r \n \
633+ X-metadata-token-ttl-seconds: {}\r \n \r \n ",
634+ invalid_value
635+ )
636+ . as_bytes ( ) ,
637+ None ,
638+ )
639+ . unwrap ( ) ;
628640 let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: BadRequest ) ;
629641 expected_response. set_content_type ( MediaType :: PlainText ) ;
630642 let error_msg = format ! (
@@ -638,43 +650,54 @@ mod tests {
638650 }
639651
640652 // Test no lifetime value provided for token.
641- let request_bytes = b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r \n \r \n " ;
642- let request = Request :: try_from ( request_bytes, None ) . unwrap ( ) ;
653+ let request = Request :: try_from (
654+ b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r \n \r \n " ,
655+ None ,
656+ )
657+ . unwrap ( ) ;
643658 let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: BadRequest ) ;
644659 expected_response. set_content_type ( MediaType :: PlainText ) ;
645660 expected_response. set_body ( Body :: new ( VmmMmdsError :: NoTtlProvided . to_string ( ) ) ) ;
646661 let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
647662 assert_eq ! ( actual_response, expected_response) ;
648663
649664 // Test valid PUT.
650- let request_bytes = b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r \n \
651- X-metadata-token-ttl-seconds: 60\r \n \r \n ";
652- let request = Request :: try_from ( request_bytes, None ) . unwrap ( ) ;
665+ let request = Request :: try_from (
666+ b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r \n \
667+ X-metadata-token-ttl-seconds: 60\r \n \r \n ",
668+ None ,
669+ )
670+ . unwrap ( ) ;
653671 let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
654672 assert_eq ! ( actual_response. status( ) , StatusCode :: OK ) ;
655673 assert_eq ! ( actual_response. content_type( ) , MediaType :: PlainText ) ;
656674
657675 // Test valid GET.
658676 let valid_token = String :: from_utf8 ( actual_response. body ( ) . unwrap ( ) . body ) . unwrap ( ) ;
659- let request_bytes = format ! (
660- "GET http://169.254.169.254/ HTTP/1.0\r \n Accept: \
661- application/json\r \n X-metadata-token: {}\r \n \r \n ",
662- valid_token
677+ let ( request, expected_response) = generate_request_and_expected_response (
678+ format ! (
679+ "GET http://169.254.169.254/ HTTP/1.0\r \n \
680+ Accept: application/json\r \n \
681+ X-metadata-token: {}\r \n \r \n ",
682+ valid_token
683+ )
684+ . as_bytes ( ) ,
685+ MediaType :: ApplicationJson ,
663686 ) ;
664- let request = Request :: try_from ( request_bytes. as_bytes ( ) , None ) . unwrap ( ) ;
665- let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: OK ) ;
666- let mut body = get_json_data ( ) . to_string ( ) ;
667- body. retain ( |c| !c. is_whitespace ( ) ) ;
668- expected_response. set_body ( Body :: new ( body) ) ;
669687 let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
670688 assert_eq ! ( actual_response, expected_response) ;
671689
672690 // Test GET request towards unsupported value type.
673- let request_bytes = format ! (
674- "GET /age HTTP/1.1\r \n X-metadata-token: {}\r \n \r \n " ,
675- valid_token
676- ) ;
677- let request = Request :: try_from ( request_bytes. as_bytes ( ) , None ) . unwrap ( ) ;
691+ let request = Request :: try_from (
692+ format ! (
693+ "GET /age HTTP/1.1\r \n \
694+ X-metadata-token: {}\r \n \r \n ",
695+ valid_token
696+ )
697+ . as_bytes ( ) ,
698+ None ,
699+ )
700+ . unwrap ( ) ;
678701 let mut expected_response = Response :: new ( Version :: Http11 , StatusCode :: NotImplemented ) ;
679702 expected_response. set_content_type ( MediaType :: PlainText ) ;
680703 let body = "Cannot retrieve value. The value has an unsupported type." . to_string ( ) ;
@@ -683,11 +706,16 @@ mod tests {
683706 assert_eq ! ( actual_response, expected_response) ;
684707
685708 // Test GET request towards invalid resource.
686- let request_bytes = format ! (
687- "GET http://169.254.169.254/invalid HTTP/1.0\r \n X-metadata-token: {}\r \n \r \n " ,
688- valid_token
689- ) ;
690- let request = Request :: try_from ( request_bytes. as_bytes ( ) , None ) . unwrap ( ) ;
709+ let request = Request :: try_from (
710+ format ! (
711+ "GET http://169.254.169.254/invalid HTTP/1.0\r \n \
712+ X-metadata-token: {}\r \n \r \n ",
713+ valid_token
714+ )
715+ . as_bytes ( ) ,
716+ None ,
717+ )
718+ . unwrap ( ) ;
691719 let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: NotFound ) ;
692720 expected_response. set_content_type ( MediaType :: PlainText ) ;
693721 expected_response. set_body ( Body :: new (
@@ -697,43 +725,41 @@ mod tests {
697725 assert_eq ! ( actual_response, expected_response) ;
698726
699727 // Test GET request without token should return Unauthorized status code.
700- let request_bytes = b"GET http://169.254.169.254/ HTTP/1.0 \r \n \r \n " ;
701- let request = Request :: try_from ( request_bytes , None ) . unwrap ( ) ;
728+ let request =
729+ Request :: try_from ( b"GET http://169.254.169.254/ HTTP/1.0 \r \n \r \n " , None ) . unwrap ( ) ;
702730 let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: Unauthorized ) ;
703731 expected_response. set_content_type ( MediaType :: PlainText ) ;
704732 expected_response. set_body ( Body :: new ( VmmMmdsError :: NoTokenProvided . to_string ( ) ) ) ;
705733 let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
706734 assert_eq ! ( actual_response, expected_response) ;
707735
708- // Test GET request with invalid token should return Unauthorized status code.
709- let request_bytes = b"GET http://169.254.169.254/ HTTP/1.0\r \n \
710- X-metadata-token: foo\r \n \r \n ";
711- let request = Request :: try_from ( request_bytes, None ) . unwrap ( ) ;
712- let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: Unauthorized ) ;
713- expected_response. set_content_type ( MediaType :: PlainText ) ;
714- expected_response. set_body ( Body :: new ( VmmMmdsError :: InvalidToken . to_string ( ) ) ) ;
715- let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
716- assert_eq ! ( actual_response, expected_response) ;
717-
718736 // Create a new MMDS token that expires in one second.
719- let request_bytes = b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r \n \
720- X-metadata-token-ttl-seconds: 1\r \n \r \n ";
721- let request = Request :: try_from ( request_bytes, None ) . unwrap ( ) ;
737+ let request = Request :: try_from (
738+ b"PUT http://169.254.169.254/latest/api/token HTTP/1.0\r \n \
739+ X-metadata-token-ttl-seconds: 1\r \n \r \n ",
740+ None ,
741+ )
742+ . unwrap ( ) ;
722743 let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
723744 assert_eq ! ( actual_response. status( ) , StatusCode :: OK ) ;
724745 assert_eq ! ( actual_response. content_type( ) , MediaType :: PlainText ) ;
725746
726747 // Test GET request with invalid tokens.
727748 // `valid_token` will become invalid after one second, when it expires.
728749 let valid_token = String :: from_utf8 ( actual_response. body ( ) . unwrap ( ) . body ) . unwrap ( ) ;
729- let invalid_token = "a" . repeat ( 58 ) ;
730- let tokens = [ invalid_token, valid_token] ;
750+ let invalid_token = "INVALID_TOKEN" ;
751+ let tokens = [ invalid_token, & valid_token] ;
731752 for token in tokens. iter ( ) {
732- let request_bytes = format ! (
733- "GET http://169.254.169.254/ HTTP/1.0\r \n X-metadata-token: {}\r \n \r \n " ,
734- token
735- ) ;
736- let request = Request :: try_from ( request_bytes. as_bytes ( ) , None ) . unwrap ( ) ;
753+ let request = Request :: try_from (
754+ format ! (
755+ "GET http://169.254.169.254/ HTTP/1.0\r \n \
756+ X-metadata-token: {}\r \n \r \n ",
757+ token
758+ )
759+ . as_bytes ( ) ,
760+ None ,
761+ )
762+ . unwrap ( ) ;
737763 let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: Unauthorized ) ;
738764 expected_response. set_content_type ( MediaType :: PlainText ) ;
739765 expected_response. set_body ( Body :: new ( VmmMmdsError :: InvalidToken . to_string ( ) ) ) ;
0 commit comments