-
Notifications
You must be signed in to change notification settings - Fork 195
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Feature: Request Compression for operations modeled with the `@reques…
…tCompression` trait (#3647)
- Loading branch information
Showing
37 changed files
with
2,131 additions
and
34 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
122 changes: 122 additions & 0 deletions
122
aws/rust-runtime/aws-config/src/default_provider/disable_request_compression.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
/* | ||
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
use crate::environment::parse_bool; | ||
use crate::provider_config::ProviderConfig; | ||
use aws_runtime::env_config::EnvConfigValue; | ||
use aws_smithy_types::error::display::DisplayErrorContext; | ||
|
||
mod env { | ||
pub(super) const DISABLE_REQUEST_COMPRESSION: &str = "AWS_DISABLE_REQUEST_COMPRESSION"; | ||
} | ||
|
||
mod profile_key { | ||
pub(super) const DISABLE_REQUEST_COMPRESSION: &str = "disable_request_compression"; | ||
} | ||
|
||
/// Load the value for "disable request compression". | ||
/// | ||
/// This checks the following sources: | ||
/// 1. The environment variable `AWS_DISABLE_REQUEST_COMPRESSION=true/false` | ||
/// 2. The profile key `disable_request_compression=true/false` | ||
/// | ||
/// If invalid values are found, the provider will return None and an error will be logged. | ||
pub(crate) async fn disable_request_compression_provider( | ||
provider_config: &ProviderConfig, | ||
) -> Option<bool> { | ||
let env = provider_config.env(); | ||
let profiles = provider_config.profile().await; | ||
|
||
EnvConfigValue::new() | ||
.env(env::DISABLE_REQUEST_COMPRESSION) | ||
.profile(profile_key::DISABLE_REQUEST_COMPRESSION) | ||
.validate(&env, profiles, parse_bool) | ||
.map_err( | ||
|err| tracing::warn!(err = %DisplayErrorContext(&err), "invalid value for `disable request compression` setting"), | ||
) | ||
.unwrap_or(None) | ||
} | ||
|
||
#[cfg(test)] | ||
mod test { | ||
use super::disable_request_compression_provider; | ||
#[allow(deprecated)] | ||
use crate::profile::profile_file::{ProfileFileKind, ProfileFiles}; | ||
use crate::provider_config::ProviderConfig; | ||
use aws_types::os_shim_internal::{Env, Fs}; | ||
use tracing_test::traced_test; | ||
|
||
#[tokio::test] | ||
#[traced_test] | ||
async fn log_error_on_invalid_value() { | ||
let conf = ProviderConfig::empty().with_env(Env::from_slice(&[( | ||
"AWS_DISABLE_REQUEST_COMPRESSION", | ||
"not-a-boolean", | ||
)])); | ||
assert_eq!(disable_request_compression_provider(&conf).await, None); | ||
assert!(logs_contain( | ||
"invalid value for `disable request compression` setting" | ||
)); | ||
assert!(logs_contain("AWS_DISABLE_REQUEST_COMPRESSION")); | ||
} | ||
|
||
#[tokio::test] | ||
#[traced_test] | ||
async fn environment_priority() { | ||
let conf = ProviderConfig::empty() | ||
.with_env(Env::from_slice(&[( | ||
"AWS_DISABLE_REQUEST_COMPRESSION", | ||
"TRUE", | ||
)])) | ||
.with_profile_config( | ||
Some( | ||
#[allow(deprecated)] | ||
ProfileFiles::builder() | ||
.with_file( | ||
#[allow(deprecated)] | ||
ProfileFileKind::Config, | ||
"conf", | ||
) | ||
.build(), | ||
), | ||
None, | ||
) | ||
.with_fs(Fs::from_slice(&[( | ||
"conf", | ||
"[default]\ndisable_request_compression = false", | ||
)])); | ||
assert_eq!( | ||
disable_request_compression_provider(&conf).await, | ||
Some(true) | ||
); | ||
} | ||
|
||
#[tokio::test] | ||
#[traced_test] | ||
async fn profile_config_works() { | ||
let conf = ProviderConfig::empty() | ||
.with_profile_config( | ||
Some( | ||
#[allow(deprecated)] | ||
ProfileFiles::builder() | ||
.with_file( | ||
#[allow(deprecated)] | ||
ProfileFileKind::Config, | ||
"conf", | ||
) | ||
.build(), | ||
), | ||
None, | ||
) | ||
.with_fs(Fs::from_slice(&[( | ||
"conf", | ||
"[default]\ndisable_request_compression = true", | ||
)])); | ||
assert_eq!( | ||
disable_request_compression_provider(&conf).await, | ||
Some(true) | ||
); | ||
} | ||
} |
127 changes: 127 additions & 0 deletions
127
aws/rust-runtime/aws-config/src/default_provider/request_min_compression_size_bytes.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
/* | ||
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
use crate::environment::parse_uint; | ||
use crate::provider_config::ProviderConfig; | ||
use aws_runtime::env_config::EnvConfigValue; | ||
use aws_smithy_types::error::display::DisplayErrorContext; | ||
|
||
mod env { | ||
pub(super) const REQUEST_MIN_COMPRESSION_SIZE_BYTES: &str = | ||
"AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES"; | ||
} | ||
|
||
mod profile_key { | ||
pub(super) const REQUEST_MIN_COMPRESSION_SIZE_BYTES: &str = | ||
"request_min_compression_size_bytes"; | ||
} | ||
|
||
/// Load the value for "request minimum compression size bytes". | ||
/// | ||
/// This checks the following sources: | ||
/// 1. The environment variable `AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES=10240` | ||
/// 2. The profile key `request_min_compression_size_bytes=10240` | ||
/// | ||
/// If invalid values are found, the provider will return None and an error will be logged. | ||
pub(crate) async fn request_min_compression_size_bytes_provider( | ||
provider_config: &ProviderConfig, | ||
) -> Option<u32> { | ||
let env = provider_config.env(); | ||
let profiles = provider_config.profile().await; | ||
|
||
EnvConfigValue::new() | ||
.env(env::REQUEST_MIN_COMPRESSION_SIZE_BYTES) | ||
.profile(profile_key::REQUEST_MIN_COMPRESSION_SIZE_BYTES) | ||
.validate(&env, profiles, parse_uint) | ||
.map_err( | ||
|err| tracing::warn!(err = %DisplayErrorContext(&err), "invalid value for `request minimum compression size bytes` setting"), | ||
) | ||
.unwrap_or(None) | ||
} | ||
|
||
#[cfg(test)] | ||
mod test { | ||
use super::request_min_compression_size_bytes_provider; | ||
#[allow(deprecated)] | ||
use crate::profile::profile_file::{ProfileFileKind, ProfileFiles}; | ||
use crate::provider_config::ProviderConfig; | ||
use aws_types::os_shim_internal::{Env, Fs}; | ||
use tracing_test::traced_test; | ||
|
||
#[tokio::test] | ||
#[traced_test] | ||
async fn log_error_on_invalid_value() { | ||
let conf = ProviderConfig::empty().with_env(Env::from_slice(&[( | ||
"AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES", | ||
"not-a-uint", | ||
)])); | ||
assert_eq!( | ||
request_min_compression_size_bytes_provider(&conf).await, | ||
None | ||
); | ||
assert!(logs_contain( | ||
"invalid value for `request minimum compression size bytes` setting" | ||
)); | ||
assert!(logs_contain("AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES")); | ||
} | ||
|
||
#[tokio::test] | ||
#[traced_test] | ||
async fn environment_priority() { | ||
let conf = ProviderConfig::empty() | ||
.with_env(Env::from_slice(&[( | ||
"AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES", | ||
"99", | ||
)])) | ||
.with_profile_config( | ||
Some( | ||
#[allow(deprecated)] | ||
ProfileFiles::builder() | ||
.with_file( | ||
#[allow(deprecated)] | ||
ProfileFileKind::Config, | ||
"conf", | ||
) | ||
.build(), | ||
), | ||
None, | ||
) | ||
.with_fs(Fs::from_slice(&[( | ||
"conf", | ||
"[default]\nrequest_min_compression_size_bytes = 100", | ||
)])); | ||
assert_eq!( | ||
request_min_compression_size_bytes_provider(&conf).await, | ||
Some(99) | ||
); | ||
} | ||
|
||
#[tokio::test] | ||
#[traced_test] | ||
async fn profile_config_works() { | ||
let conf = ProviderConfig::empty() | ||
.with_profile_config( | ||
Some( | ||
#[allow(deprecated)] | ||
ProfileFiles::builder() | ||
.with_file( | ||
#[allow(deprecated)] | ||
ProfileFileKind::Config, | ||
"conf", | ||
) | ||
.build(), | ||
), | ||
None, | ||
) | ||
.with_fs(Fs::from_slice(&[( | ||
"conf", | ||
"[default]\nrequest_min_compression_size_bytes = 22", | ||
)])); | ||
assert_eq!( | ||
request_min_compression_size_bytes_provider(&conf).await, | ||
Some(22) | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.