mirror of
https://github.com/versity/versitygw.git
synced 2026-09-21 07:24:29 +00:00
fix: fixes the UploadPart failure with no precalculated checksum header for FULL_OBJECT checksum type
Fixes #1342 This PR includes two main changes: 1. It fixes the case where `x-amz-checksum-x` (precalculated checksum headers) are not provided for `UploadPart`, and the checksum type for the multipart upload is `FULL_OBJECT`. In this scenario, the server no longer returns an error. 2. When no `x-amz-checksum-x` is provided for `UploadPart`, and `x-amz-sdk-checksum-algorithm` is also missing, the gateway now calculates the part checksum based on the multipart upload's checksum algorithm and stores it accordingly. Additionally, the PR adds integration tests for: * The two cases above * The case where only `x-amz-sdk-checksum-algorithm` is provided
This commit is contained in:
+14
-1
@@ -2401,7 +2401,8 @@ func (p *Posix) UploadPart(ctx context.Context, input *s3.UploadPartInput) (*s3.
|
||||
|
||||
// If checksum isn't provided for the part,
|
||||
// but it has been provided on mp initalization
|
||||
if hashRdr == nil && chErr == nil && checksums.Algorithm != "" {
|
||||
// and checksum type is 'COMPOSITE', return mismatch error
|
||||
if hashRdr == nil && chErr == nil && checksums.Type == types.ChecksumTypeComposite {
|
||||
return nil, s3err.GetChecksumTypeMismatchErr(checksums.Algorithm, "null")
|
||||
}
|
||||
|
||||
@@ -2414,6 +2415,18 @@ func (p *Posix) UploadPart(ctx context.Context, input *s3.UploadPartInput) (*s3.
|
||||
}
|
||||
}
|
||||
|
||||
// if no checksum algorithm or precalculated checksum is
|
||||
// provided, but one has been on multipart upload initialization,
|
||||
// anyways calculate and store the uploaded part checksum
|
||||
if hashRdr == nil && checksums.Algorithm != "" {
|
||||
hashRdr, err = utils.NewHashReader(tr, "", utils.HashType(strings.ToLower(string(checksums.Algorithm))))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("initialize hash reader: %w", err)
|
||||
}
|
||||
|
||||
tr = hashRdr
|
||||
}
|
||||
|
||||
_, err = io.Copy(f, tr)
|
||||
if err != nil {
|
||||
if errors.Is(err, syscall.EDQUOT) {
|
||||
|
||||
Reference in New Issue
Block a user