diff --git a/crates/s3/src/client.rs b/crates/s3/src/client.rs
index f52eec2..fe93553 100644
--- a/crates/s3/src/client.rs
+++ b/crates/s3/src/client.rs
@@ -1683,7 +1683,7 @@ impl ObjectStore for S3Client {
.list_buckets()
.send()
.await
- .map_err(|e| Error::Network(e.to_string()))?;
+ .map_err(|e| Error::Network(Self::format_sdk_error(&e)))?;
let buckets = response
.buckets()
@@ -1848,7 +1848,7 @@ impl ObjectStore for S3Client {
.bucket(bucket)
.send()
.await
- .map_err(|e| Error::Network(e.to_string()))?;
+ .map_err(|e| Error::Network(Self::format_sdk_error(&e)))?;
Ok(())
}
@@ -3981,6 +3981,52 @@ mod tests {
}
}
+ #[tokio::test]
+ async fn list_buckets_preserves_service_error_code() {
+ let response = http::Response::builder()
+ .status(403)
+ .header("x-amz-error-code", "InvalidAccessKeyId")
+ .body(SdkBody::from(
+ r#"
+
+ InvalidAccessKeyId
+ The AWS access key Id you provided does not exist in our records.
+"#,
+ ))
+ .expect("build list buckets response");
+ let (client, _request_receiver) = test_s3_client(Some(response));
+
+ let result = client.list_buckets().await;
+
+ match result {
+ Err(Error::Network(message)) => assert!(message.contains("InvalidAccessKeyId")),
+ other => panic!("Expected Network for list buckets failure, got: {other:?}"),
+ }
+ }
+
+ #[tokio::test]
+ async fn create_bucket_preserves_service_error_code() {
+ let response = http::Response::builder()
+ .status(403)
+ .header("x-amz-error-code", "InvalidAccessKeyId")
+ .body(SdkBody::from(
+ r#"
+
+ InvalidAccessKeyId
+ The AWS access key Id you provided does not exist in our records.
+"#,
+ ))
+ .expect("build create bucket response");
+ let (client, _request_receiver) = test_s3_client(Some(response));
+
+ let result = client.create_bucket("bucket").await;
+
+ match result {
+ Err(Error::Network(message)) => assert!(message.contains("InvalidAccessKeyId")),
+ other => panic!("Expected Network for create bucket failure, got: {other:?}"),
+ }
+ }
+
#[tokio::test]
async fn delete_bucket_maps_bucket_not_empty_to_conflict() {
let response = http::Response::builder()