893 893 | let identity = Credentials::for_tests().into();
|
894 894 | let signing_params = signing_params(&identity, SigningSettings::default());
|
895 895 | let creq = CanonicalRequest::from(&req, &signing_params).unwrap();
|
896 896 | let expected = test.canonical_request(SignatureLocation::Headers);
|
897 897 | let actual = format!("{}", creq);
|
898 898 | assert_eq!(actual, expected);
|
899 899 | }
|
900 900 |
|
901 901 | #[test]
|
902 902 | fn test_tilde_in_uri() {
|
903 - | let req = http0::Request::builder()
|
903 + | let req = http::Request::builder()
|
904 904 | .uri("https://s3.us-east-1.amazonaws.com/my-bucket?list-type=2&prefix=~objprefix&single&k=&unreserved=-_.~").body("").unwrap().into();
|
905 905 | let req = SignableRequest::from(&req);
|
906 906 | let identity = Credentials::for_tests().into();
|
907 907 | let signing_params = signing_params(&identity, SigningSettings::default());
|
908 908 | let creq = CanonicalRequest::from(&req, &signing_params).unwrap();
|
909 909 | assert_eq!(
|
910 910 | Some("k=&list-type=2&prefix=~objprefix&single=&unreserved=-_.~"),
|
911 911 | creq.params.as_deref(),
|
912 912 | );
|
913 913 | }
|
914 914 |
|
915 915 | #[test]
|
916 916 | fn test_signing_urls_with_percent_encoded_query_strings() {
|
917 917 | let all_printable_ascii_chars: String = (32u8..127).map(char::from).collect();
|
918 918 | let uri = Uri::from_static("https://s3.us-east-1.amazonaws.com/my-bucket");
|
919 919 |
|
920 920 | let mut query_writer = QueryWriter::new(&uri);
|
921 921 | query_writer.insert("list-type", "2");
|
922 922 | query_writer.insert("prefix", &all_printable_ascii_chars);
|
923 923 |
|
924 - | let req = http0::Request::builder()
|
924 + | let req = http::Request::builder()
|
925 925 | .uri(query_writer.build_uri())
|
926 926 | .body("")
|
927 927 | .unwrap()
|
928 928 | .into();
|
929 929 | let req = SignableRequest::from(&req);
|
930 930 | let identity = Credentials::for_tests().into();
|
931 931 | let signing_params = signing_params(&identity, SigningSettings::default());
|
932 932 | let creq = CanonicalRequest::from(&req, &signing_params).unwrap();
|
933 933 |
|
934 934 | let expected = "list-type=2&prefix=%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~";
|
935 935 | let actual = creq.params.unwrap();
|
936 936 | assert_eq!(expected, actual);
|
937 937 | }
|
938 938 |
|
939 939 | #[test]
|
940 940 | fn test_omit_session_token() {
|
941 941 | let test = SigningSuiteTest::v4("get-vanilla-query-order-key-case");
|
942 942 | let req = test.request();
|
943 943 | let req = SignableRequest::from(&req);
|
944 944 | let settings = SigningSettings {
|
945 945 | session_token_mode: SessionTokenMode::Include,
|
946 946 | ..Default::default()
|
947 947 | };
|
948 948 | let identity = Credentials::for_tests_with_session_token().into();
|
949 949 | let mut signing_params = signing_params(&identity, settings);
|
950 950 |
|
951 951 | let creq = CanonicalRequest::from(&req, &signing_params).unwrap();
|
952 952 | assert_eq!(
|
953 953 | creq.values.signed_headers().as_str(),
|
954 954 | "host;x-amz-date;x-amz-security-token"
|
955 955 | );
|
956 956 | assert_eq!(
|
957 957 | creq.headers.get("x-amz-security-token").unwrap(),
|
958 958 | "notarealsessiontoken"
|
959 959 | );
|
960 960 |
|
961 961 | signing_params.set_session_token_mode(SessionTokenMode::Exclude);
|
962 962 | let creq = CanonicalRequest::from(&req, &signing_params).unwrap();
|
963 963 | assert_eq!(
|
964 964 | creq.headers.get("x-amz-security-token").unwrap(),
|
965 965 | "notarealsessiontoken"
|
966 966 | );
|
967 967 | assert_eq!(creq.values.signed_headers().as_str(), "host;x-amz-date");
|
968 968 | }
|
969 969 |
|
970 970 | // It should exclude authorization, user-agent, x-amzn-trace-id, and transfer-encoding headers from presigning
|
971 971 | #[test]
|
972 972 | fn non_presigning_header_exclusion() {
|
973 - | let request = http0::Request::builder()
|
973 + | let request = http::Request::builder()
|
974 974 | .uri("https://some-endpoint.some-region.amazonaws.com")
|
975 975 | .header("authorization", "test-authorization")
|
976 976 | .header("content-type", "application/xml")
|
977 977 | .header("content-length", "0")
|
978 978 | .header("user-agent", "test-user-agent")
|
979 979 | .header("x-amzn-trace-id", "test-trace-id")
|
980 980 | .header("x-amz-user-agent", "test-user-agent")
|
981 981 | .header("transfer-encoding", "chunked")
|
982 982 | .body("")
|
983 983 | .unwrap()
|
984 984 | .into();
|
985 985 | let request = SignableRequest::from(&request);
|
986 986 |
|
987 987 | let settings = SigningSettings {
|
988 988 | signature_location: SignatureLocation::Headers,
|
989 989 | ..Default::default()
|
990 990 | };
|
991 991 |
|
992 992 | let identity = Credentials::for_tests().into();
|
993 993 | let signing_params = signing_params(&identity, settings);
|
994 994 | let canonical = CanonicalRequest::from(&request, &signing_params).unwrap();
|
995 995 |
|
996 996 | let values = canonical.values.as_headers().unwrap();
|
997 997 | assert_eq!(
|
998 998 | "content-length;content-type;host;x-amz-date;x-amz-user-agent",
|
999 999 | values.signed_headers.as_str()
|
1000 1000 | );
|
1001 1001 | }
|
1002 1002 |
|
1003 1003 | // It should exclude authorization, user-agent, x-amz-user-agent, x-amzn-trace-id, and transfer-encoding headers from presigning
|
1004 1004 | #[test]
|
1005 1005 | fn presigning_header_exclusion() {
|
1006 - | let request = http0::Request::builder()
|
1006 + | let request = http::Request::builder()
|
1007 1007 | .uri("https://some-endpoint.some-region.amazonaws.com")
|
1008 1008 | .header("authorization", "test-authorization")
|
1009 1009 | .header("content-type", "application/xml")
|
1010 1010 | .header("content-length", "0")
|
1011 1011 | .header("user-agent", "test-user-agent")
|
1012 1012 | .header("x-amzn-trace-id", "test-trace-id")
|
1013 1013 | .header("x-amz-user-agent", "test-user-agent")
|
1014 1014 | .header("transfer-encoding", "chunked")
|
1015 1015 | .body("")
|
1016 1016 | .unwrap()
|
1017 1017 | .into();
|
1018 1018 | let request = SignableRequest::from(&request);
|
1019 1019 |
|
1020 1020 | let settings = SigningSettings {
|
1021 1021 | signature_location: SignatureLocation::QueryParams,
|
1022 1022 | expires_in: Some(Duration::from_secs(30)),
|
1023 1023 | ..Default::default()
|
1024 1024 | };
|
1025 1025 |
|
1026 1026 | let identity = Credentials::for_tests().into();
|
1027 1027 | let signing_params = signing_params(&identity, settings);
|
1028 1028 | let canonical = CanonicalRequest::from(&request, &signing_params).unwrap();
|
1029 1029 |
|
1030 1030 | let values = canonical.values.into_query_params().unwrap();
|
1031 1031 | assert_eq!(
|
1032 1032 | "content-length;content-type;host",
|
1033 1033 | values.signed_headers.as_str()
|
1034 1034 | );
|
1035 1035 | }
|
1036 1036 |
|
1037 1037 | #[allow(clippy::ptr_arg)] // The proptest macro requires this arg to be a Vec instead of a slice.
|
1038 1038 | fn valid_input(input: &Vec<String>) -> bool {
|
1039 1039 | [
|
1040 1040 | "content-length".to_owned(),
|
1041 1041 | "content-type".to_owned(),
|
1042 1042 | "host".to_owned(),
|
1043 1043 | ]
|
1044 1044 | .iter()
|
1045 1045 | .all(|element| !input.contains(element))
|
1046 1046 | }
|
1047 1047 |
|
1048 1048 | proptest! {
|
1049 1049 | #[test]
|
1050 1050 | fn presigning_header_exclusion_with_explicit_exclusion_list_specified(
|
1051 1051 | excluded_headers in prop::collection::vec("[a-z]{1,20}", 1..10).prop_filter(
|
1052 1052 | "`excluded_headers` should pass the `valid_input` check",
|
1053 1053 | valid_input,
|
1054 1054 | )
|
1055 1055 | ) {
|
1056 - | let mut request_builder = http0::Request::builder()
|
1056 + | let mut request_builder = http::Request::builder()
|
1057 1057 | .uri("https://some-endpoint.some-region.amazonaws.com")
|
1058 1058 | .header("content-type", "application/xml")
|
1059 1059 | .header("content-length", "0");
|
1060 1060 | for key in &excluded_headers {
|
1061 1061 | request_builder = request_builder.header(key, "value");
|
1062 1062 | }
|
1063 1063 | let request = request_builder.body("").unwrap().into();
|
1064 1064 |
|
1065 1065 | let request = SignableRequest::from(&request);
|
1066 1066 |
|