1 1 | /*
|
2 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
3 3 | * SPDX-License-Identifier: Apache-2.0
|
4 4 | */
|
5 5 |
|
6 + | use aws_config::retry::{RetryConfigBuilder, RetryMode};
|
6 7 | use aws_credential_types::provider::SharedCredentialsProvider;
|
7 8 | use aws_credential_types::Credentials;
|
8 9 | use aws_sdk_s3::Client;
|
9 10 | use aws_smithy_runtime::assert_str_contains;
|
10 11 | use aws_smithy_runtime::client::http::test_util::infallible_client_fn;
|
11 12 | use aws_smithy_types::body::SdkBody;
|
12 13 | use aws_smithy_types::error::metadata::ProvideErrorMetadata;
|
13 14 | use aws_types::region::Region;
|
14 15 | use aws_types::SdkConfig;
|
15 16 |
|
16 17 | const ERROR_RESPONSE: &str = r#"<?xml version="1.0" encoding="UTF-8"?>
|
17 18 | <Error>
|
18 19 | <Code>SlowDown</Code>
|
19 20 | <Message>Please reduce your request rate.</Message>
|
20 21 | <RequestId>K2H6N7ZGQT6WHCEG</RequestId>
|
21 22 | <HostId>WWoZlnK4pTjKCYn6eNV7GgOurabfqLkjbSyqTvDMGBaI9uwzyNhSaDhOCPs8paFGye7S6b/AB3A=</HostId>
|
22 23 | </Error>
|
23 24 | "#;
|
24 25 |
|
25 26 | #[tokio::test]
|
26 27 | async fn status_200_errors() {
|
27 28 | let http_client =
|
28 29 | infallible_client_fn(|_req| http::Response::new(SdkBody::from(ERROR_RESPONSE)));
|
29 30 | let sdk_config = SdkConfig::builder()
|
30 31 | .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))
|
31 32 | .region(Region::new("us-west-4"))
|
32 33 | .http_client(http_client)
|
33 34 | .build();
|
34 35 | let client = Client::new(&sdk_config);
|
35 36 | let error = client
|
36 37 | .delete_objects()
|
37 38 | .bucket("bucket")
|
38 39 | .send()
|
39 40 | .await
|
40 41 | .expect_err("should fail");
|
41 42 | assert_eq!(error.as_service_error().unwrap().code(), Some("SlowDown"));
|
42 43 | assert_str_contains!(format!("{:?}", error), "Please reduce your request rate");
|
43 44 | }
|
45 + |
|
46 + | #[tracing_test::traced_test]
|
47 + | #[tokio::test]
|
48 + | async fn retry_200_internal_error() {
|
49 + | let http_client = infallible_client_fn(|_req| {
|
50 + | http::Response::new(SdkBody::from(
|
51 + | r#"<?xml version="1.0" encoding="UTF-8"?>
|
52 + | <Error>
|
53 + | <Type>Server</Type>
|
54 + | <Code>InternalError</Code>
|
55 + | <Message>>We encountered an internal error. Please try again.</Message>
|
56 + | <RequestId>DOESNOTMATTER</RequestId>
|
57 + | </Error>
|
58 + | "#,
|
59 + | ))
|
60 + | });
|
61 + | let sdk_config = SdkConfig::builder()
|
62 + | .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))
|
63 + | .region(Region::new("us-west-4"))
|
64 + | .http_client(http_client)
|
65 + | .retry_config(
|
66 + | RetryConfigBuilder::new()
|
67 + | .max_attempts(2)
|
68 + | .mode(RetryMode::Standard)
|
69 + | .build(),
|
70 + | )
|
71 + | .build();
|
72 + | let client = Client::new(&sdk_config);
|
73 + | let error = client
|
74 + | .delete_objects()
|
75 + | .bucket("bucket")
|
76 + | .send()
|
77 + | .await
|
78 + | .expect_err("should fail");
|
79 + | assert_eq!(
|
80 + | error.as_service_error().unwrap().code(),
|
81 + | Some("InternalError")
|
82 + | );
|
83 + | assert!(logs_contain("retrying after"));
|
84 + | }
|