Skip to content

Commit ccf7e2f

Browse files
committed
Fix S3 Express metric J propagation using Identity::from()
1 parent 0515084 commit ccf7e2f

File tree

2 files changed

+49
-8
lines changed

2 files changed

+49
-8
lines changed

aws/rust-runtime/aws-inlineable/src/s3_express.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -520,10 +520,8 @@ pub(crate) mod identity_provider {
520520
let mut data = Credentials::try_from(creds)?;
521521
data.get_property_mut_or_default::<Vec<AwsCredentialFeature>>()
522522
.push(AwsCredentialFeature::S3ExpressBucket);
523-
Ok((
524-
Identity::new(data.clone(), data.expiry()),
525-
data.expiry().unwrap(),
526-
))
523+
let expiry = data.expiry().unwrap();
524+
Ok((Identity::from(data), expiry))
527525
})
528526
.await
529527
}
@@ -754,14 +752,24 @@ pub(crate) mod identity_provider {
754752
let credentials = identity
755753
.data::<Credentials>()
756754
.expect("Identity should contain Credentials");
757-
758755
let features = credentials
759756
.get_property::<Vec<AwsCredentialFeature>>()
760757
.expect("Credentials should have features");
761-
762758
assert!(
763759
features.contains(&AwsCredentialFeature::S3ExpressBucket),
764-
"S3ExpressBucket feature should be present in credentials returned by identity()"
760+
"S3ExpressBucket feature should be present in Credentials' property field"
761+
);
762+
763+
let identity_layer = identity
764+
.property::<aws_smithy_types::config_bag::FrozenLayer>()
765+
.expect("Identity should have a property layer");
766+
let identity_features: Vec<AwsCredentialFeature> = identity_layer
767+
.load::<AwsCredentialFeature>()
768+
.cloned()
769+
.collect();
770+
assert!(
771+
identity_features.contains(&AwsCredentialFeature::S3ExpressBucket),
772+
"S3ExpressBucket feature should be present in Identity's property field"
765773
);
766774
}
767775
}

aws/sdk/integration-tests/s3/tests/express.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ use std::time::{Duration, SystemTime};
77

88
use aws_config::timeout::TimeoutConfig;
99
use aws_config::Region;
10-
use aws_runtime::user_agent::test_util::assert_ua_does_not_contain_metric_values;
10+
use aws_runtime::user_agent::test_util::{
11+
assert_ua_contains_metric_values, assert_ua_does_not_contain_metric_values,
12+
};
1113
use aws_sdk_s3::config::endpoint::{EndpointFuture, Params, ResolveEndpoint};
1214
use aws_sdk_s3::config::{Builder, Credentials};
1315
use aws_sdk_s3::presigning::PresigningConfig;
@@ -466,3 +468,34 @@ async fn s3_express_auth_flow_should_not_be_reached_with_no_auth_schemes() {
466468
// If s3 Express auth flow were exercised, no request would be received, most likely due to `TimeoutError`.
467469
let _ = request.expect_request();
468470
}
471+
472+
#[tokio::test]
473+
async fn s3_express_request_contains_metric_j() {
474+
let _logs = capture_test_logs();
475+
476+
let http_client = ReplayingClient::from_file("tests/data/express/mixed-auths.json").unwrap();
477+
let client = test_client(|b| b.http_client(http_client.clone())).await;
478+
479+
let _result = client
480+
.list_objects_v2()
481+
.bucket("s3express-test-bucket--usw2-az1--x-s3")
482+
.send()
483+
.await
484+
.expect("Request should succeed");
485+
486+
let requests = http_client.take_requests().await;
487+
488+
let s3_express_request = requests
489+
.iter()
490+
.find(|req| req.headers().get("x-amz-s3session-token").is_some())
491+
.expect("Should have at least one S3 Express request with session token");
492+
493+
let user_agent = s3_express_request
494+
.headers()
495+
.get("x-amz-user-agent")
496+
.expect("User-Agent header should be present")
497+
.to_str()
498+
.expect("User-Agent should be valid UTF-8");
499+
500+
assert_ua_contains_metric_values(user_agent, &["J"]);
501+
}

0 commit comments

Comments
 (0)