From 8c08a2c752cb3e89bf12bdf75d766fec60dd89c5 Mon Sep 17 00:00:00 2001 From: Drazen Urch Date: Mon, 4 May 2026 22:23:40 +0200 Subject: [PATCH] fix: omit body headers for head object --- s3/src/request/blocking.rs | 25 +++++++++++++++++++++++++ s3/src/request/request_trait.rs | 1 + 2 files changed, 26 insertions(+) diff --git a/s3/src/request/blocking.rs b/s3/src/request/blocking.rs index ac065fd898..413eb64442 100644 --- a/s3/src/request/blocking.rs +++ b/s3/src/request/blocking.rs @@ -240,4 +240,29 @@ mod tests { Ok(()) } + + #[test] + fn head_object_omits_body_headers_from_request_and_signature() -> Result<()> { + let region = "custom-region".parse()?; + let bucket = Bucket::new("my-first-bucket", region, fake_credentials())?; + let request = AttoRequest::new(&bucket, "/my-first/path", Command::HeadObject).unwrap(); + + let headers = request.headers().unwrap(); + + assert!(!headers.contains_key("Content-Length")); + assert!(!headers.contains_key("Content-Type")); + assert!(headers.contains_key("x-amz-content-sha256")); + + let authorization = headers.get("Authorization").unwrap().to_str()?; + let signed_headers = authorization + .split("SignedHeaders=") + .nth(1) + .and_then(|value| value.split(',').next()) + .unwrap(); + + assert!(!signed_headers.contains("content-length")); + assert!(!signed_headers.contains("content-type")); + + Ok(()) + } } diff --git a/s3/src/request/request_trait.rs b/s3/src/request/request_trait.rs index 5686cc8dda..856bf9d00f 100644 --- a/s3/src/request/request_trait.rs +++ b/s3/src/request/request_trait.rs @@ -711,6 +711,7 @@ pub trait Request { } Command::ListObjects { .. } => {} Command::ListObjectsV2 { .. } => {} + Command::HeadObject => {} Command::GetObject => {} Command::GetObjectTagging => {} Command::GetBucketLocation => {}