return ChecksumType in CompleteMultipartUpload result

This commit is contained in:
Alex Auvolat
2025-05-22 18:17:56 +02:00
parent d1d5c67ba7
commit c13af97b81
3 changed files with 14 additions and 4 deletions
+2 -2
View File
@@ -28,8 +28,8 @@ pub const X_AMZ_CHECKSUM_SHA1: HeaderName = HeaderName::from_static("x-amz-check
pub const X_AMZ_CHECKSUM_SHA256: HeaderName = HeaderName::from_static("x-amz-checksum-sha256");
// Values for x-amz-checksum-type
pub const COMPOSITE: &[u8] = b"COMPOSITE";
pub const FULL_OBJECT: &[u8] = b"FULL_OBJECT";
pub const COMPOSITE: &str = "COMPOSITE";
pub const FULL_OBJECT: &str = "FULL_OBJECT";
pub type Crc32Checksum = [u8; 4];
pub type Crc32cChecksum = [u8; 4];
+7 -2
View File
@@ -518,6 +518,11 @@ pub async fn handle_complete_multipart_upload(
Some(ChecksumValue::Sha256(x)) => Some(s3_xml::Value(BASE64_STANDARD.encode(&x))),
_ => None,
},
checksum_type: match checksum_algorithm {
Some((_, ChecksumType::Composite)) => Some(s3_xml::Value(COMPOSITE.into())),
Some((_, ChecksumType::FullObject)) => Some(s3_xml::Value(FULL_OBJECT.into())),
None => None,
},
};
let xml = s3_xml::to_xml_with_header(&result)?;
@@ -691,8 +696,8 @@ pub fn request_checksum_algorithm_and_type(
)),
(Some(x), Some(algo)) => {
let checksum_type = match x.as_bytes() {
COMPOSITE => ChecksumType::Composite,
FULL_OBJECT => ChecksumType::FullObject,
x if x == COMPOSITE.as_bytes() => ChecksumType::Composite,
x if x == FULL_OBJECT.as_bytes() => ChecksumType::FullObject,
_ => return Err(Error::bad_request("Invalid x-amz-checksum-type value")),
};
match (checksum_type, algo) {
+5
View File
@@ -141,6 +141,8 @@ pub struct CompleteMultipartUploadResult {
pub checksum_sha1: Option<Value>,
#[serde(rename = "ChecksumSHA256")]
pub checksum_sha256: Option<Value>,
#[serde(rename = "ChecksumType")]
pub checksum_type: Option<Value>,
}
#[derive(Debug, Serialize, PartialEq, Eq)]
@@ -514,6 +516,7 @@ mod tests {
#[test]
fn complete_multipart_upload_result() -> Result<(), ApiError> {
use garage_api_common::signature::checksum::COMPOSITE;
let result = CompleteMultipartUploadResult {
xmlns: (),
location: Some(Value("https://garage.tld/mybucket/a/plop".to_string())),
@@ -525,6 +528,7 @@ mod tests {
checksum_crc64nvme: None,
checksum_sha1: Some(Value("ZJAnHyG8PeKz9tI8UTcHrJos39A=".into())),
checksum_sha256: None,
checksum_type: Some(Value(COMPOSITE.into())),
};
assert_eq!(
to_xml_with_header(&result)?,
@@ -535,6 +539,7 @@ mod tests {
<Key>a/plop</Key>\
<ETag>&quot;3858f62230ac3c915f300c664312c11f-9&quot;</ETag>\
<ChecksumSHA1>ZJAnHyG8PeKz9tI8UTcHrJos39A=</ChecksumSHA1>\
<ChecksumType>COMPOSITE</ChecksumType>\
</CompleteMultipartUploadResult>"
);
Ok(())