Merge pull request #255 from versity/fix/issue-245-upload_part_copy-invalid-range

Issue 245, UploadPartCopy exceeding range error
This commit is contained in:
Ben McClelland
2023-09-19 09:04:05 -07:00
committed by GitHub
3 changed files with 42 additions and 1 deletions

View File

@@ -882,7 +882,7 @@ func (p *Posix) UploadPartCopy(_ context.Context, upi *s3.UploadPartCopyInput) (
}
if startOffset+length > fi.Size()+1 {
return s3response.CopyObjectResult{}, s3err.GetAPIError(s3err.ErrInvalidRequest)
return s3response.CopyObjectResult{}, s3err.GetAPIError(s3err.ErrInvalidRange)
}
f, err := openTmpFile(filepath.Join(*upi.Bucket, objdir),

View File

@@ -131,6 +131,7 @@ func TestUploadPartCopy(s *S3Conf) {
UploadPartCopy_non_existing_source_object_key(s)
UploadPartCopy_success(s)
UploadPartCopy_by_range_invalid_range(s)
UploadPartCopy_greater_range_than_obj_size(s)
UploadPartCopy_by_range_success(s)
}

View File

@@ -2426,6 +2426,46 @@ func UploadPartCopy_by_range_invalid_range(s *S3Conf) {
})
}
func UploadPartCopy_greater_range_than_obj_size(s *S3Conf) {
testName := "UploadPartCopy_greater_range_than_obj_size"
actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {
obj, srcBucket, srcObj := "my-obj", getBucketName(), "src-obj"
err := setup(s, srcBucket)
if err != nil {
return err
}
srcObjSize := 5 * 1024 * 1024
_, _, err = putObjectWithData(int64(srcObjSize), &s3.PutObjectInput{
Bucket: &srcBucket,
Key: &srcObj,
}, s3client)
if err != nil {
return err
}
out, err := CreateMp(s3client, bucket, obj)
if err != nil {
return err
}
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
_, err = s3client.UploadPartCopy(ctx, &s3.UploadPartCopyInput{
Bucket: &bucket,
CopySource: getPtr(srcBucket + "/" + srcObj),
UploadId: out.UploadId,
Key: &obj,
CopySourceRange: getPtr(fmt.Sprintf("bytes=0-%v", srcObjSize+50)), // The specified range is greater than the actual object size
PartNumber: 1,
})
cancel()
if err := checkApiErr(err, s3err.GetAPIError(s3err.ErrInvalidRange)); err != nil {
return err
}
return nil
})
}
func UploadPartCopy_by_range_success(s *S3Conf) {
testName := "UploadPartCopy_by_range_success"
actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {