From 2b22509a9020b383fd72b571f86aa09782f9c011 Mon Sep 17 00:00:00 2001 From: jonaustin09 Date: Wed, 29 Nov 2023 11:34:21 -0500 Subject: [PATCH] fix: Fixes #302, #308. Added error handling function in s3 proxy implementation, which converts sdk error to API Errors --- backend/s3proxy/s3.go | 83 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 70 insertions(+), 13 deletions(-) diff --git a/backend/s3proxy/s3.go b/backend/s3proxy/s3.go index b02ddbe..f760b62 100644 --- a/backend/s3proxy/s3.go +++ b/backend/s3proxy/s3.go @@ -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 }