fix: Fixes #302, #308. Added error handling function in s3 proxy implementation, which converts sdk error to API Errors

This commit is contained in:
jonaustin09
2023-11-29 11:34:21 -05:00
committed by Ben McClelland
parent 953d05ca56
commit 2b22509a90

View File

@@ -17,14 +17,18 @@ package s3proxy
import (
"context"
"encoding/json"
"errors"
"fmt"
"io"
"strconv"
awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http"
"github.com/aws/aws-sdk-go-v2/service/s3"
"github.com/aws/aws-sdk-go-v2/service/s3/types"
"github.com/aws/smithy-go"
"github.com/versity/versitygw/auth"
"github.com/versity/versitygw/backend"
"github.com/versity/versitygw/s3err"
"github.com/versity/versitygw/s3response"
)
@@ -55,6 +59,7 @@ func (s *S3be) ListBuckets(ctx context.Context, owner string, isAdmin bool) (s3r
}
output, err := client.ListBuckets(ctx, &s3.ListBucketsInput{})
err = handleError(err)
if err != nil {
return s3response.ListAllMyBucketsResult{}, err
}
@@ -84,7 +89,10 @@ func (s *S3be) HeadBucket(ctx context.Context, input *s3.HeadBucketInput) (*s3.H
return nil, err
}
return client.HeadBucket(ctx, input)
out, err := client.HeadBucket(ctx, input)
err = handleError(err)
return out, err
}
func (s *S3be) CreateBucket(ctx context.Context, input *s3.CreateBucketInput) error {
@@ -94,7 +102,7 @@ func (s *S3be) CreateBucket(ctx context.Context, input *s3.CreateBucketInput) er
}
_, err = client.CreateBucket(ctx, input)
return err
return handleError(err)
}
func (s *S3be) DeleteBucket(ctx context.Context, input *s3.DeleteBucketInput) error {
@@ -104,7 +112,7 @@ func (s *S3be) DeleteBucket(ctx context.Context, input *s3.DeleteBucketInput) er
}
_, err = client.DeleteBucket(ctx, input)
return err
return handleError(err)
}
func (s *S3be) CreateMultipartUpload(ctx context.Context, input *s3.CreateMultipartUploadInput) (*s3.CreateMultipartUploadOutput, error) {
@@ -113,7 +121,9 @@ func (s *S3be) CreateMultipartUpload(ctx context.Context, input *s3.CreateMultip
return nil, err
}
return client.CreateMultipartUpload(ctx, input)
out, err := client.CreateMultipartUpload(ctx, input)
err = handleError(err)
return out, err
}
func (s *S3be) CompleteMultipartUpload(ctx context.Context, input *s3.CompleteMultipartUploadInput) (*s3.CompleteMultipartUploadOutput, error) {
@@ -122,7 +132,9 @@ func (s *S3be) CompleteMultipartUpload(ctx context.Context, input *s3.CompleteMu
return nil, err
}
return client.CompleteMultipartUpload(ctx, input)
out, err := client.CompleteMultipartUpload(ctx, input)
err = handleError(err)
return out, err
}
func (s *S3be) AbortMultipartUpload(ctx context.Context, input *s3.AbortMultipartUploadInput) error {
@@ -132,6 +144,7 @@ func (s *S3be) AbortMultipartUpload(ctx context.Context, input *s3.AbortMultipar
}
_, err = client.AbortMultipartUpload(ctx, input)
err = handleError(err)
return err
}
@@ -146,6 +159,7 @@ func (s *S3be) ListMultipartUploads(ctx context.Context, input *s3.ListMultipart
}
output, err := client.ListMultipartUploads(ctx, input)
err = handleError(err)
if err != nil {
return s3response.ListMultipartUploadsResult{}, err
}
@@ -198,6 +212,7 @@ func (s *S3be) ListParts(ctx context.Context, input *s3.ListPartsInput) (s3respo
}
output, err := client.ListParts(ctx, input)
err = handleError(err)
if err != nil {
return s3response.ListPartsResult{}, err
}
@@ -251,6 +266,7 @@ func (s *S3be) UploadPart(ctx context.Context, input *s3.UploadPartInput) (etag
}
output, err := client.UploadPart(ctx, input)
err = handleError(err)
if err != nil {
return "", err
}
@@ -265,6 +281,7 @@ func (s *S3be) UploadPartCopy(ctx context.Context, input *s3.UploadPartCopyInput
}
output, err := client.UploadPartCopy(ctx, input)
err = handleError(err)
if err != nil {
return s3response.CopyObjectResult{}, err
}
@@ -282,6 +299,7 @@ func (s *S3be) PutObject(ctx context.Context, input *s3.PutObjectInput) (string,
}
output, err := client.PutObject(ctx, input)
err = handleError(err)
if err != nil {
return "", err
}
@@ -295,7 +313,10 @@ func (s *S3be) HeadObject(ctx context.Context, input *s3.HeadObjectInput) (*s3.H
return nil, err
}
return client.HeadObject(ctx, input)
out, err := client.HeadObject(ctx, input)
err = handleError(err)
return out, err
}
func (s *S3be) GetObject(ctx context.Context, input *s3.GetObjectInput, w io.Writer) (*s3.GetObjectOutput, error) {
@@ -305,6 +326,7 @@ func (s *S3be) GetObject(ctx context.Context, input *s3.GetObjectInput, w io.Wri
}
output, err := client.GetObject(ctx, input)
err = handleError(err)
if err != nil {
return nil, err
}
@@ -324,7 +346,10 @@ func (s *S3be) GetObjectAttributes(ctx context.Context, input *s3.GetObjectAttri
return nil, err
}
return client.GetObjectAttributes(ctx, input)
out, err := client.GetObjectAttributes(ctx, input)
err = handleError(err)
return out, err
}
func (s *S3be) CopyObject(ctx context.Context, input *s3.CopyObjectInput) (*s3.CopyObjectOutput, error) {
@@ -333,7 +358,10 @@ func (s *S3be) CopyObject(ctx context.Context, input *s3.CopyObjectInput) (*s3.C
return nil, err
}
return client.CopyObject(ctx, input)
out, err := client.CopyObject(ctx, input)
err = handleError(err)
return out, err
}
func (s *S3be) ListObjects(ctx context.Context, input *s3.ListObjectsInput) (*s3.ListObjectsOutput, error) {
@@ -342,7 +370,10 @@ func (s *S3be) ListObjects(ctx context.Context, input *s3.ListObjectsInput) (*s3
return nil, err
}
return client.ListObjects(ctx, input)
out, err := client.ListObjects(ctx, input)
err = handleError(err)
return out, err
}
func (s *S3be) ListObjectsV2(ctx context.Context, input *s3.ListObjectsV2Input) (*s3.ListObjectsV2Output, error) {
@@ -351,7 +382,10 @@ func (s *S3be) ListObjectsV2(ctx context.Context, input *s3.ListObjectsV2Input)
return nil, err
}
return client.ListObjectsV2(ctx, input)
out, err := client.ListObjectsV2(ctx, input)
err = handleError(err)
return out, err
}
func (s *S3be) DeleteObject(ctx context.Context, input *s3.DeleteObjectInput) error {
@@ -361,7 +395,7 @@ func (s *S3be) DeleteObject(ctx context.Context, input *s3.DeleteObjectInput) er
}
_, err = client.DeleteObject(ctx, input)
return err
return handleError(err)
}
func (s *S3be) DeleteObjects(ctx context.Context, input *s3.DeleteObjectsInput) (s3response.DeleteObjectsResult, error) {
@@ -371,6 +405,7 @@ func (s *S3be) DeleteObjects(ctx context.Context, input *s3.DeleteObjectsInput)
}
output, err := client.DeleteObjects(ctx, input)
err = handleError(err)
if err != nil {
return s3response.DeleteObjectsResult{}, err
}
@@ -388,6 +423,7 @@ func (s *S3be) GetBucketAcl(ctx context.Context, input *s3.GetBucketAclInput) ([
}
output, err := client.GetBucketAcl(ctx, input)
err = handleError(err)
if err != nil {
return nil, err
}
@@ -437,7 +473,7 @@ func (s S3be) PutBucketAcl(ctx context.Context, bucket string, data []byte) erro
}
_, err = client.PutBucketAcl(ctx, input)
return err
return handleError(err)
}
func (s *S3be) PutObjectTagging(ctx context.Context, bucket, object string, tags map[string]string) error {
@@ -461,7 +497,7 @@ func (s *S3be) PutObjectTagging(ctx context.Context, bucket, object string, tags
Key: &object,
Tagging: tagging,
})
return err
return handleError(err)
}
func (s *S3be) GetObjectTagging(ctx context.Context, bucket, object string) (map[string]string, error) {
@@ -474,6 +510,7 @@ func (s *S3be) GetObjectTagging(ctx context.Context, bucket, object string) (map
Bucket: &bucket,
Key: &object,
})
err = handleError(err)
if err != nil {
return nil, err
}
@@ -496,5 +533,25 @@ func (s *S3be) DeleteObjectTagging(ctx context.Context, bucket, object string) e
Bucket: &bucket,
Key: &object,
})
return handleError(err)
}
func handleError(err error) error {
if err == nil {
return nil
}
var ae smithy.APIError
if errors.As(err, &ae) {
apiErr := s3err.APIError{
Code: ae.ErrorCode(),
Description: ae.ErrorMessage(),
}
var re *awshttp.ResponseError
if errors.As(err, &re) {
apiErr.HTTPStatusCode = re.Response.StatusCode
}
return apiErr
}
return err
}