From a5b342015cd1fc931f4d7c3acc38e4ac705cd2df Mon Sep 17 00:00:00 2001 From: ZzIsGod1019 <1498852723@11.com> Date: Thu, 23 Oct 2025 09:21:28 +0800 Subject: [PATCH 1/2] fix: PutBucketLifecycle failed fix: command PutBucketLifecycle failed(SignatureDoesNotMatch) --- s3/src/request/request_trait.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/s3/src/request/request_trait.rs b/s3/src/request/request_trait.rs index f5c542b5e6..9199689102 100644 --- a/s3/src/request/request_trait.rs +++ b/s3/src/request/request_trait.rs @@ -770,7 +770,6 @@ pub trait Request { let digest = md5::compute(to_string(configuration)?.as_bytes()); let hash = general_purpose::STANDARD.encode(digest.as_ref()); headers.insert(HeaderName::from_static("content-md5"), hash.parse()?); - headers.remove("x-amz-content-sha256"); } else if let Command::PutBucketCors { expected_bucket_owner, configuration, From 2db43eb2b1b1b0c64500ee85aacd8016f9f9aea3 Mon Sep 17 00:00:00 2001 From: ZzIsGod1019 <1498852723@qq.com> Date: Sat, 3 Jan 2026 16:33:36 +0800 Subject: [PATCH 2/2] add custom_headers parameter to initiate_multipart_upload --- s3/src/bucket.rs | 16 ++++++++++++---- s3/src/command.rs | 3 ++- s3/src/request/request_trait.rs | 9 +++++++++ 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/s3/src/bucket.rs b/s3/src/bucket.rs index 7cf34d861b..c125a218eb 100644 --- a/s3/src/bucket.rs +++ b/s3/src/bucket.rs @@ -1664,7 +1664,7 @@ impl Bucket { } let msg = self - .initiate_multipart_upload(s3_path, content_type) + .initiate_multipart_upload(s3_path, content_type, custom_headers) .await?; let path = msg.key; let upload_id = &msg.upload_id; @@ -1806,7 +1806,7 @@ impl Bucket { s3_path: &str, content_type: &str, ) -> Result { - let msg = self.initiate_multipart_upload(s3_path, content_type)?; + let msg = self.initiate_multipart_upload(s3_path, content_type, None)?; let path = msg.key; let upload_id = &msg.upload_id; @@ -1859,8 +1859,12 @@ impl Bucket { &self, s3_path: &str, content_type: &str, + custom_headers: Option, ) -> Result { - let command = Command::InitiateMultipartUpload { content_type }; + let command = Command::InitiateMultipartUpload { + content_type, + custom_headers, + }; let request = RequestImpl::new(self, s3_path, command).await?; let response_data = request.response_data(false).await?; if response_data.status_code() >= 300 { @@ -1877,8 +1881,12 @@ impl Bucket { &self, s3_path: &str, content_type: &str, + custom_headers: Option, ) -> Result { - let command = Command::InitiateMultipartUpload { content_type }; + let command = Command::InitiateMultipartUpload { + content_type, + custom_headers, + }; let request = RequestImpl::new(self, s3_path, command)?; let response_data = request.response_data(false)?; if response_data.status_code() >= 300 { diff --git a/s3/src/command.rs b/s3/src/command.rs index c56ca3ee46..86d20837d2 100644 --- a/s3/src/command.rs +++ b/s3/src/command.rs @@ -134,6 +134,7 @@ pub enum Command<'a> { }, InitiateMultipartUpload { content_type: &'a str, + custom_headers: Option, }, UploadPart { part_number: u32, @@ -258,7 +259,7 @@ impl<'a> Command<'a> { pub fn content_type(&self) -> String { match self { - Command::InitiateMultipartUpload { content_type } => content_type.to_string(), + Command::InitiateMultipartUpload { content_type, .. } => content_type.to_string(), Command::PutObject { content_type, .. } => content_type.to_string(), Command::CompleteMultipartUpload { .. } | Command::PutBucketLifecycle { .. } diff --git a/s3/src/request/request_trait.rs b/s3/src/request/request_trait.rs index 9199689102..f53325c6e3 100644 --- a/s3/src/request/request_trait.rs +++ b/s3/src/request/request_trait.rs @@ -696,6 +696,15 @@ pub trait Request { } } + // Append custom headers for InitiateMultipartUpload request if any + if let Command::InitiateMultipartUpload { custom_headers, .. } = self.command() + && let Some(custom_headers) = custom_headers + { + for (k, v) in custom_headers.iter() { + headers.insert(k.clone(), v.clone()); + } + } + let host_header = self.host_header(); headers.insert(HOST, host_header.parse()?);