@@ -430,7 +430,7 @@ mod tests {
430
430
// Test with empty `Accept` header. micro-http defaults to `Accept: text/plain`.
431
431
let ( request, expected_response) = generate_request_and_expected_response (
432
432
b"GET http://169.254.169.254/ HTTP/1.0\r \n \"
433
- Accept:\r \n \r \n " ,
433
+ Accept:\r \n \r \n " ,
434
434
MediaType :: PlainText ,
435
435
) ;
436
436
assert_eq ! (
@@ -441,7 +441,7 @@ mod tests {
441
441
// Test with `Accept: */*` header.
442
442
let ( request, expected_response) = generate_request_and_expected_response (
443
443
b"GET http://169.254.169.254/ HTTP/1.0\r \n \"
444
- Accept: */*\r \n \r \n " ,
444
+ Accept: */*\r \n \r \n " ,
445
445
MediaType :: PlainText ,
446
446
) ;
447
447
assert_eq ! (
@@ -452,7 +452,7 @@ mod tests {
452
452
// Test with `Accept: text/plain`.
453
453
let ( request, expected_response) = generate_request_and_expected_response (
454
454
b"GET http://169.254.169.254/ HTTP/1.0\r \n \
455
- Accept: text/plain\r \n \r \n ",
455
+ Accept: text/plain\r \n \r \n ",
456
456
MediaType :: PlainText ,
457
457
) ;
458
458
assert_eq ! (
@@ -463,7 +463,7 @@ mod tests {
463
463
// Test with `Accept: application/json`.
464
464
let ( request, expected_response) = generate_request_and_expected_response (
465
465
b"GET http://169.254.169.254/ HTTP/1.0\r \n \
466
- Accept: application/json\r \n \r \n ",
466
+ Accept: application/json\r \n \r \n ",
467
467
MediaType :: ApplicationJson ,
468
468
) ;
469
469
assert_eq ! ( convert_to_response( mmds, request) , expected_response) ;
@@ -485,8 +485,9 @@ mod tests {
485
485
) ;
486
486
487
487
// 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 ( ) ;
490
491
let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: NotFound ) ;
491
492
expected_response. set_content_type ( MediaType :: PlainText ) ;
492
493
expected_response. set_body ( Body :: new (
@@ -496,8 +497,7 @@ mod tests {
496
497
assert_eq ! ( actual_response, expected_response) ;
497
498
498
499
// 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 ( ) ;
501
501
let mut expected_response = Response :: new ( Version :: Http11 , StatusCode :: NotImplemented ) ;
502
502
expected_response. set_content_type ( MediaType :: PlainText ) ;
503
503
let body = "Cannot retrieve value. The value has an unsupported type." . to_string ( ) ;
@@ -508,8 +508,11 @@ mod tests {
508
508
// Test not allowed HTTP Method.
509
509
let not_allowed_methods = [ "PUT" , "PATCH" ] ;
510
510
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 ! ( "{method} http://169.254.169.255/ HTTP/1.0\r \n \r \n " ) . as_bytes ( ) ,
513
+ None ,
514
+ )
515
+ . unwrap ( ) ;
513
516
let mut expected_response =
514
517
Response :: new ( Version :: Http10 , StatusCode :: MethodNotAllowed ) ;
515
518
expected_response. set_content_type ( MediaType :: PlainText ) ;
@@ -520,32 +523,29 @@ mod tests {
520
523
}
521
524
522
525
// 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 ( ) ;
525
527
let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: BadRequest ) ;
526
528
expected_response. set_content_type ( MediaType :: PlainText ) ;
527
529
expected_response. set_body ( Body :: new ( VmmMmdsError :: InvalidURI . to_string ( ) ) ) ;
528
530
let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
529
531
assert_eq ! ( actual_response, expected_response) ;
530
532
531
533
// 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
+ ) ;
538
540
let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
539
541
assert_eq ! ( actual_response, expected_response) ;
540
542
541
543
// 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
+ ) ;
549
549
let actual_response = convert_to_response ( mmds, request) ;
550
550
assert_eq ! ( actual_response, expected_response) ;
551
551
}
@@ -566,8 +566,8 @@ mod tests {
566
566
) ;
567
567
568
568
// 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 ( ) ;
571
571
let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: MethodNotAllowed ) ;
572
572
expected_response. set_content_type ( MediaType :: PlainText ) ;
573
573
expected_response. set_body ( Body :: new ( VmmMmdsError :: MethodNotAllowed . to_string ( ) ) ) ;
@@ -577,25 +577,30 @@ mod tests {
577
577
assert_eq ! ( actual_response, expected_response) ;
578
578
579
579
// 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 ( ) ;
584
587
let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: BadRequest ) ;
585
588
expected_response. set_content_type ( MediaType :: PlainText ) ;
586
589
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"
589
591
. to_string ( ) ,
590
592
) ) ;
591
593
let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
592
594
assert_eq ! ( actual_response, expected_response) ;
593
595
594
596
// Test PUT requests.
595
597
// 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 ( ) ;
599
604
let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: BadRequest ) ;
600
605
expected_response. set_content_type ( MediaType :: PlainText ) ;
601
606
expected_response. set_body ( Body :: new (
@@ -605,9 +610,12 @@ mod tests {
605
610
assert_eq ! ( actual_response, expected_response) ;
606
611
607
612
// 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 ( ) ;
611
619
let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: NotFound ) ;
612
620
expected_response. set_content_type ( MediaType :: PlainText ) ;
613
621
expected_response. set_body ( Body :: new (
@@ -619,62 +627,77 @@ mod tests {
619
627
// Test invalid lifetime values for token.
620
628
let invalid_values = [ MIN_TOKEN_TTL_SECONDS - 1 , MAX_TOKEN_TTL_SECONDS + 1 ] ;
621
629
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
+ #[ rustfmt:: skip]
631
+ let request = Request :: try_from (
632
+ format ! (
633
+ "PUT http://169.254.169.254/latest/api/token HTTP/1.0\r \n \
634
+ X-metadata-token-ttl-seconds: {invalid_value}\r \n \r \n "
635
+ )
636
+ . as_bytes ( ) ,
637
+ None ,
638
+ )
639
+ . unwrap ( ) ;
628
640
let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: BadRequest ) ;
629
641
expected_response. set_content_type ( MediaType :: PlainText ) ;
642
+ #[ rustfmt:: skip]
630
643
let error_msg = format ! (
631
- "Invalid time to live value provided for token: {}. Please provide a value \
632
- between {} and {}.",
633
- invalid_value, MIN_TOKEN_TTL_SECONDS , MAX_TOKEN_TTL_SECONDS
644
+ "Invalid time to live value provided for token: {invalid_value}. \
645
+ Please provide a value between {MIN_TOKEN_TTL_SECONDS} and {MAX_TOKEN_TTL_SECONDS}.",
634
646
) ;
635
647
expected_response. set_body ( Body :: new ( error_msg) ) ;
636
648
let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
637
649
assert_eq ! ( actual_response, expected_response) ;
638
650
}
639
651
640
652
// 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 ( ) ;
643
658
let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: BadRequest ) ;
644
659
expected_response. set_content_type ( MediaType :: PlainText ) ;
645
660
expected_response. set_body ( Body :: new ( VmmMmdsError :: NoTtlProvided . to_string ( ) ) ) ;
646
661
let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
647
662
assert_eq ! ( actual_response, expected_response) ;
648
663
649
664
// 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 ( ) ;
653
671
let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
654
672
assert_eq ! ( actual_response. status( ) , StatusCode :: OK ) ;
655
673
assert_eq ! ( actual_response. content_type( ) , MediaType :: PlainText ) ;
656
674
657
675
// Test valid GET.
658
676
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
+ #[ rustfmt:: skip]
678
+ let ( request, expected_response) = generate_request_and_expected_response (
679
+ format ! (
680
+ "GET http://169.254.169.254/ HTTP/1.0\r \n \
681
+ Accept: application/json\r \n \
682
+ X-metadata-token: {valid_token}\r \n \r \n ",
683
+ )
684
+ . as_bytes ( ) ,
685
+ MediaType :: ApplicationJson ,
663
686
) ;
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) ) ;
669
687
let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
670
688
assert_eq ! ( actual_response, expected_response) ;
671
689
672
690
// 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
+ #[ rustfmt:: skip]
692
+ let request = Request :: try_from (
693
+ format ! (
694
+ "GET /age HTTP/1.1\r \n \
695
+ X-metadata-token: {valid_token}\r \n \r \n ",
696
+ )
697
+ . as_bytes ( ) ,
698
+ None ,
699
+ )
700
+ . unwrap ( ) ;
678
701
let mut expected_response = Response :: new ( Version :: Http11 , StatusCode :: NotImplemented ) ;
679
702
expected_response. set_content_type ( MediaType :: PlainText ) ;
680
703
let body = "Cannot retrieve value. The value has an unsupported type." . to_string ( ) ;
@@ -683,11 +706,16 @@ mod tests {
683
706
assert_eq ! ( actual_response, expected_response) ;
684
707
685
708
// 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
+ #[ rustfmt:: skip]
710
+ let request = Request :: try_from (
711
+ format ! (
712
+ "GET http://169.254.169.254/invalid HTTP/1.0\r \n \
713
+ X-metadata-token: {valid_token}\r \n \r \n ",
714
+ )
715
+ . as_bytes ( ) ,
716
+ None ,
717
+ )
718
+ . unwrap ( ) ;
691
719
let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: NotFound ) ;
692
720
expected_response. set_content_type ( MediaType :: PlainText ) ;
693
721
expected_response. set_body ( Body :: new (
@@ -697,43 +725,41 @@ mod tests {
697
725
assert_eq ! ( actual_response, expected_response) ;
698
726
699
727
// 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 ( ) ;
702
730
let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: Unauthorized ) ;
703
731
expected_response. set_content_type ( MediaType :: PlainText ) ;
704
732
expected_response. set_body ( Body :: new ( VmmMmdsError :: NoTokenProvided . to_string ( ) ) ) ;
705
733
let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
706
734
assert_eq ! ( actual_response, expected_response) ;
707
735
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
-
718
736
// 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 ( ) ;
722
743
let actual_response = convert_to_response ( mmds. clone ( ) , request) ;
723
744
assert_eq ! ( actual_response. status( ) , StatusCode :: OK ) ;
724
745
assert_eq ! ( actual_response. content_type( ) , MediaType :: PlainText ) ;
725
746
726
747
// Test GET request with invalid tokens.
727
748
// `valid_token` will become invalid after one second, when it expires.
728
749
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] ;
731
752
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
+ #[ rustfmt:: skip]
754
+ let request = Request :: try_from (
755
+ format ! (
756
+ "GET http://169.254.169.254/ HTTP/1.0\r \n \
757
+ X-metadata-token: {token}\r \n \r \n ",
758
+ )
759
+ . as_bytes ( ) ,
760
+ None ,
761
+ )
762
+ . unwrap ( ) ;
737
763
let mut expected_response = Response :: new ( Version :: Http10 , StatusCode :: Unauthorized ) ;
738
764
expected_response. set_content_type ( MediaType :: PlainText ) ;
739
765
expected_response. set_body ( Body :: new ( VmmMmdsError :: InvalidToken . to_string ( ) ) ) ;
0 commit comments