-
Notifications
You must be signed in to change notification settings - Fork 195
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
update AWS runtime crates for request compression #3632
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
/* | ||
* 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 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() { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I believe |
||
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) | ||
); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
/* | ||
* 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 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() { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The above comment regarding testing against a shared config file also applies here? |
||
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) | ||
); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -41,6 +41,25 @@ pub(crate) fn parse_bool(value: &str) -> Result<bool, InvalidBooleanValue> { | |
} | ||
} | ||
|
||
#[derive(Debug)] | ||
pub(crate) struct InvalidUintValue { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I assume we only enforce There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Correct. If it's not public then we don't have to worry about forwards compatibility. |
||
value: String, | ||
} | ||
|
||
impl fmt::Display for InvalidUintValue { | ||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | ||
write!(f, "{} is not a valid u32", self.value) | ||
} | ||
} | ||
|
||
impl Error for InvalidUintValue {} | ||
|
||
pub(crate) fn parse_uint(value: &str) -> Result<u32, InvalidUintValue> { | ||
value.parse::<u32>().map_err(|_| InvalidUintValue { | ||
value: value.to_string(), | ||
}) | ||
} | ||
|
||
#[derive(Debug)] | ||
pub(crate) struct InvalidUrlValue { | ||
value: String, | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Seems odd to me these end up being public to the world but that seems to be the pattern here. I would have thought
pub crate
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was doing it to match the other providers but I don't mind making them
pub(crate)
. We can always undo that later if we decide to.