-
Notifications
You must be signed in to change notification settings - Fork 196
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
update AWS runtime crates for request compression (#3632)
This PR includes all the changes necessary for AWS runtime crates to support request compression. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._
- Loading branch information
Showing
8 changed files
with
405 additions
and
10 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
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.