aboutsummaryrefslogtreecommitdiff
path: root/src/api/s3/multipart.rs
diff options
context:
space:
mode:
authorAlex Auvolat <lx@deuxfleurs.fr>2025-02-17 19:54:25 +0100
committerAlex Auvolat <lx@deuxfleurs.fr>2025-02-17 19:54:25 +0100
commit658541d812103662be88ad6d3d1c0fdf1a948862 (patch)
tree89919eada94167b94174e4eb2aaa48e5a2f46c6f /src/api/s3/multipart.rs
parentc5df820e2c2b4bff5e239b8e99f07178b98b3f5a (diff)
downloadgarage-658541d812103662be88ad6d3d1c0fdf1a948862.tar.gz
garage-658541d812103662be88ad6d3d1c0fdf1a948862.zip
api: use checksumming in api_common::signature for put/putpart
Diffstat (limited to 'src/api/s3/multipart.rs')
-rw-r--r--src/api/s3/multipart.rs27
1 files changed, 16 insertions, 11 deletions
diff --git a/src/api/s3/multipart.rs b/src/api/s3/multipart.rs
index f381d670..59a469d1 100644
--- a/src/api/s3/multipart.rs
+++ b/src/api/s3/multipart.rs
@@ -94,7 +94,6 @@ pub async fn handle_put_part(
key: &str,
part_number: u64,
upload_id: &str,
- content_sha256: Option<Hash>,
) -> Result<Response<ResBody>, Error> {
let ReqCtx { garage, .. } = &ctx;
@@ -105,18 +104,23 @@ pub async fn handle_put_part(
Some(x) => Some(x.to_str()?.to_string()),
None => None,
},
- sha256: content_sha256,
+ sha256: None,
extra: request_checksum_value(req.headers())?,
};
// Read first chuck, and at the same time try to get object to see if it exists
let key = key.to_string();
- let (req_head, req_body) = req.into_parts();
+ let (req_head, mut req_body) = req.into_parts();
+
+ req_body.add_expected_checksums(expected_checksums.clone());
+ // TODO: avoid parsing encryption headers twice...
+ if !EncryptionParams::new_from_headers(&garage, &req_head.headers)?.is_encrypted() {
+ req_body.add_md5();
+ }
- let (stream, checksums) = req_body.streaming_with_checksums(true);
+ let (stream, stream_checksums) = req_body.streaming_with_checksums();
let stream = stream.map_err(Error::from);
- // TODO checksums
let mut chunker = StreamChunker::new(stream, garage.config.block_size);
@@ -176,21 +180,22 @@ pub async fn handle_put_part(
garage.version_table.insert(&version).await?;
// Copy data to version
- let checksummer =
- Checksummer::init(&expected_checksums, !encryption.is_encrypted()).add(checksum_algorithm);
- let (total_size, checksums, _) = read_and_put_blocks(
+ // TODO don't duplicate checksums
+ let (total_size, _, _) = read_and_put_blocks(
&ctx,
&version,
encryption,
part_number,
first_block,
- &mut chunker,
- checksummer,
+ chunker,
+ Checksummer::new(),
)
.await?;
// Verify that checksums map
- checksums.verify(&expected_checksums)?;
+ let checksums = stream_checksums
+ .await
+ .ok_or_internal_error("checksum calculation")??;
// Store part etag in version
let etag = encryption.etag_from_md5(&checksums.md5);