From 339db8bf238c4d976855c4a754081cd48fe8ce7a Mon Sep 17 00:00:00 2001 From: Ben McClelland Date: Wed, 17 May 2023 15:28:21 -0700 Subject: [PATCH] fix: cleanup backend error return types --- backend/backend.go | 167 +++++++++++++++++++------------------- backend/common.go | 10 ++- s3api/controllers/base.go | 125 ++++++++++++++-------------- s3err/s3err.go | 4 +- 4 files changed, 161 insertions(+), 145 deletions(-) diff --git a/backend/backend.go b/backend/backend.go index b5f320a..04e8b19 100644 --- a/backend/backend.go +++ b/backend/backend.go @@ -14,35 +14,35 @@ type Backend interface { GetIAMConfig() ([]byte, error) Shutdown() - ListBuckets() (*s3.ListBucketsOutput, s3err.ErrorCode) - HeadBucket(bucket string) (*s3.HeadBucketOutput, s3err.ErrorCode) - GetBucketAcl(bucket string) (*s3.GetBucketAclOutput, s3err.ErrorCode) - PutBucket(bucket string) s3err.ErrorCode - DeleteBucket(bucket string) s3err.ErrorCode + ListBuckets() (*s3.ListBucketsOutput, error) + HeadBucket(bucket string) (*s3.HeadBucketOutput, error) + GetBucketAcl(bucket string) (*s3.GetBucketAclOutput, error) + PutBucket(bucket string) error + DeleteBucket(bucket string) error - CreateMultipartUpload(*s3.CreateMultipartUploadInput) (*s3.CreateMultipartUploadOutput, s3err.ErrorCode) - CompleteMultipartUpload(bucket, object, uploadID string, parts []types.Part) (*s3.CompleteMultipartUploadOutput, s3err.ErrorCode) - AbortMultipartUpload(*s3.AbortMultipartUploadInput) s3err.ErrorCode - ListMultipartUploads(output *s3.ListMultipartUploadsInput) (*s3.ListMultipartUploadsOutput, s3err.ErrorCode) - ListObjectParts(bucket, object, uploadID string, partNumberMarker int, maxParts int) (*s3.ListPartsOutput, s3err.ErrorCode) - CopyPart(srcBucket, srcObject, DstBucket, uploadID, rangeHeader string, part int) (*types.CopyPartResult, s3err.ErrorCode) - PutObjectPart(bucket, object, uploadID string, part int, r io.Reader) (etag string, err s3err.ErrorCode) + CreateMultipartUpload(*s3.CreateMultipartUploadInput) (*s3.CreateMultipartUploadOutput, error) + CompleteMultipartUpload(bucket, object, uploadID string, parts []types.Part) (*s3.CompleteMultipartUploadOutput, error) + AbortMultipartUpload(*s3.AbortMultipartUploadInput) error + ListMultipartUploads(output *s3.ListMultipartUploadsInput) (*s3.ListMultipartUploadsOutput, error) + ListObjectParts(bucket, object, uploadID string, partNumberMarker int, maxParts int) (*s3.ListPartsOutput, error) + CopyPart(srcBucket, srcObject, DstBucket, uploadID, rangeHeader string, part int) (*types.CopyPartResult, error) + PutObjectPart(bucket, object, uploadID string, part int, r io.Reader) (etag string, err error) - PutObject(bucket, object string, r io.Reader) (string, s3err.ErrorCode) - HeadObject(bucket, object string, etag string) (*s3.HeadObjectOutput, s3err.ErrorCode) - GetObject(bucket, object string, startOffset, length int64, writer io.Writer, etag string) (*s3.GetObjectOutput, s3err.ErrorCode) - GetObjectAcl(bucket, object string) (*s3.GetObjectAclOutput, s3err.ErrorCode) - GetObjectAttributes(bucket, object string, attributes []string) (*s3.GetObjectAttributesOutput, s3err.ErrorCode) - CopyObject(srcBucket, srcObject, DstBucket, dstObject string) (*s3.CopyObjectOutput, s3err.ErrorCode) - ListObjects(bucket, prefix, marker, delim string, maxkeys int) (*s3.ListBucketsOutput, s3err.ErrorCode) - ListObjectsV2(bucket, prefix, marker, delim string, maxkeys int) (*s3.ListBucketsOutput, s3err.ErrorCode) - DeleteObject(bucket, object string) s3err.ErrorCode - DeleteObjects(bucket string, objects *s3.DeleteObjectsInput) s3err.ErrorCode - PutBucketAcl(*s3.PutBucketAclInput) s3err.ErrorCode - PutObjectAcl(*s3.PutObjectAclInput) s3err.ErrorCode - RestoreObject(bucket, object string, restoreRequest *s3.RestoreObjectInput) s3err.ErrorCode - UploadPart(bucket, object, uploadId string, Body io.ReadSeeker) (*s3.UploadPartOutput, s3err.ErrorCode) - UploadPartCopy(*s3.UploadPartCopyInput) (*s3.UploadPartCopyOutput, s3err.ErrorCode) + PutObject(bucket, object string, r io.Reader) (string, error) + HeadObject(bucket, object string, etag string) (*s3.HeadObjectOutput, error) + GetObject(bucket, object string, startOffset, length int64, writer io.Writer, etag string) (*s3.GetObjectOutput, error) + GetObjectAcl(bucket, object string) (*s3.GetObjectAclOutput, error) + GetObjectAttributes(bucket, object string, attributes []string) (*s3.GetObjectAttributesOutput, error) + CopyObject(srcBucket, srcObject, DstBucket, dstObject string) (*s3.CopyObjectOutput, error) + ListObjects(bucket, prefix, marker, delim string, maxkeys int) (*s3.ListBucketsOutput, error) + ListObjectsV2(bucket, prefix, marker, delim string, maxkeys int) (*s3.ListBucketsOutput, error) + DeleteObject(bucket, object string) error + DeleteObjects(bucket string, objects *s3.DeleteObjectsInput) error + PutBucketAcl(*s3.PutBucketAclInput) error + PutObjectAcl(*s3.PutObjectAclInput) error + RestoreObject(bucket, object string, restoreRequest *s3.RestoreObjectInput) error + UploadPart(bucket, object, uploadId string, Body io.ReadSeeker) (*s3.UploadPartOutput, error) + UploadPartCopy(*s3.UploadPartCopyInput) (*s3.UploadPartCopyOutput, error) IsTaggingSupported() bool GetTags(bucket, object string) (map[string]string, error) @@ -52,6 +52,8 @@ type Backend interface { type BackendUnsupported struct{} +var _ Backend = &BackendUnsupported{} + func New() Backend { return &BackendUnsupported{} } @@ -59,93 +61,92 @@ func New() Backend { func (BackendUnsupported) GetIAMConfig() ([]byte, error) { return nil, fmt.Errorf("not supported") } -func (BackendUnsupported) SubscribeIAMEvents() {} -func (BackendUnsupported) Shutdown() {} +func (BackendUnsupported) Shutdown() {} func (BackendUnsupported) String() string { return "Unsupported" } -func (BackendUnsupported) ListBuckets() (*s3.ListBucketsOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) ListBuckets() (*s3.ListBucketsOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) PutBucketAcl(*s3.PutBucketAclInput) s3err.ErrorCode { - return s3err.ErrNotImplemented +func (BackendUnsupported) PutBucketAcl(*s3.PutBucketAclInput) error { + return s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) PutObjectAcl(*s3.PutObjectAclInput) s3err.ErrorCode { - return s3err.ErrNotImplemented +func (BackendUnsupported) PutObjectAcl(*s3.PutObjectAclInput) error { + return s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) RestoreObject(bucket, object string, restoreRequest *s3.RestoreObjectInput) s3err.ErrorCode { - return s3err.ErrNotImplemented +func (BackendUnsupported) RestoreObject(bucket, object string, restoreRequest *s3.RestoreObjectInput) error { + return s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) UploadPartCopy(*s3.UploadPartCopyInput) (*s3.UploadPartCopyOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) UploadPartCopy(*s3.UploadPartCopyInput) (*s3.UploadPartCopyOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) UploadPart(bucket, object, uploadId string, Body io.ReadSeeker) (*s3.UploadPartOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) UploadPart(bucket, object, uploadId string, Body io.ReadSeeker) (*s3.UploadPartOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) GetBucketAcl(bucket string) (*s3.GetBucketAclOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) GetBucketAcl(bucket string) (*s3.GetBucketAclOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) HeadBucket(bucket string) (*s3.HeadBucketOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) HeadBucket(bucket string) (*s3.HeadBucketOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) PutBucket(bucket string) s3err.ErrorCode { - return s3err.ErrNotImplemented +func (BackendUnsupported) PutBucket(bucket string) error { + return s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) DeleteBucket(bucket string) s3err.ErrorCode { - return s3err.ErrNotImplemented +func (BackendUnsupported) DeleteBucket(bucket string) error { + return s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) CreateMultipartUpload(input *s3.CreateMultipartUploadInput) (*s3.CreateMultipartUploadOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) CreateMultipartUpload(input *s3.CreateMultipartUploadInput) (*s3.CreateMultipartUploadOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) CompleteMultipartUpload(bucket, object, uploadID string, parts []types.Part) (*s3.CompleteMultipartUploadOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) CompleteMultipartUpload(bucket, object, uploadID string, parts []types.Part) (*s3.CompleteMultipartUploadOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) AbortMultipartUpload(input *s3.AbortMultipartUploadInput) s3err.ErrorCode { - return s3err.ErrNotImplemented +func (BackendUnsupported) AbortMultipartUpload(input *s3.AbortMultipartUploadInput) error { + return s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) ListMultipartUploads(output *s3.ListMultipartUploadsInput) (*s3.ListMultipartUploadsOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) ListMultipartUploads(output *s3.ListMultipartUploadsInput) (*s3.ListMultipartUploadsOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) ListObjectParts(bucket, object, uploadID string, partNumberMarker int, maxParts int) (*s3.ListPartsOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) ListObjectParts(bucket, object, uploadID string, partNumberMarker int, maxParts int) (*s3.ListPartsOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) CopyPart(srcBucket, srcObject, DstBucket, uploadID, rangeHeader string, part int) (*types.CopyPartResult, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) CopyPart(srcBucket, srcObject, DstBucket, uploadID, rangeHeader string, part int) (*types.CopyPartResult, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) PutObjectPart(bucket, object, uploadID string, part int, r io.Reader) (etag string, err s3err.ErrorCode) { - return "", s3err.ErrNotImplemented +func (BackendUnsupported) PutObjectPart(bucket, object, uploadID string, part int, r io.Reader) (etag string, err error) { + return "", s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) PutObject(bucket, object string, r io.Reader) (string, s3err.ErrorCode) { - return "", s3err.ErrNotImplemented +func (BackendUnsupported) PutObject(bucket, object string, r io.Reader) (string, error) { + return "", s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) DeleteObject(bucket, object string) s3err.ErrorCode { - return s3err.ErrNotImplemented +func (BackendUnsupported) DeleteObject(bucket, object string) error { + return s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) DeleteObjects(bucket string, objects *s3.DeleteObjectsInput) s3err.ErrorCode { - return s3err.ErrNotImplemented +func (BackendUnsupported) DeleteObjects(bucket string, objects *s3.DeleteObjectsInput) error { + return s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) GetObject(bucket, object string, startOffset, length int64, writer io.Writer, etag string) (*s3.GetObjectOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) GetObject(bucket, object string, startOffset, length int64, writer io.Writer, etag string) (*s3.GetObjectOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) HeadObject(bucket, object string, etag string) (*s3.HeadObjectOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) HeadObject(bucket, object string, etag string) (*s3.HeadObjectOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) GetObjectAcl(bucket, object string) (*s3.GetObjectAclOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) GetObjectAcl(bucket, object string) (*s3.GetObjectAclOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) GetObjectAttributes(bucket, object string, attributes []string) (*s3.GetObjectAttributesOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) GetObjectAttributes(bucket, object string, attributes []string) (*s3.GetObjectAttributesOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) CopyObject(srcBucket, srcObject, DstBucket, dstObject string) (*s3.CopyObjectOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) CopyObject(srcBucket, srcObject, DstBucket, dstObject string) (*s3.CopyObjectOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) ListObjects(bucket, prefix, marker, delim string, maxkeys int) (*s3.ListBucketsOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) ListObjects(bucket, prefix, marker, delim string, maxkeys int) (*s3.ListBucketsOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } -func (BackendUnsupported) ListObjectsV2(bucket, prefix, marker, delim string, maxkeys int) (*s3.ListBucketsOutput, s3err.ErrorCode) { - return nil, s3err.ErrNotImplemented +func (BackendUnsupported) ListObjectsV2(bucket, prefix, marker, delim string, maxkeys int) (*s3.ListBucketsOutput, error) { + return nil, s3err.GetAPIError(s3err.ErrNotImplemented) } func (BackendUnsupported) IsTaggingSupported() bool { return false } diff --git a/backend/common.go b/backend/common.go index 85bbacd..d96432d 100644 --- a/backend/common.go +++ b/backend/common.go @@ -1,3 +1,11 @@ package backend -func IsValidBucketName(nake string) bool { return true } +import "github.com/aws/aws-sdk-go-v2/service/s3/types" + +func IsValidBucketName(name string) bool { return true } + +type ByBucketName []types.Bucket + +func (d ByBucketName) Len() int { return len(d) } +func (d ByBucketName) Swap(i, j int) { d[i], d[j] = d[j], d[i] } +func (d ByBucketName) Less(i, j int) bool { return *d[i].Name < *d[j].Name } diff --git a/s3api/controllers/base.go b/s3api/controllers/base.go index 3268f22..65b31ea 100644 --- a/s3api/controllers/base.go +++ b/s3api/controllers/base.go @@ -26,8 +26,8 @@ func New(be backend.Backend) S3ApiController { } func (c S3ApiController) ListBuckets(ctx *fiber.Ctx) error { - res, code := c.be.ListBuckets() - return responce(ctx, res, code) + res, err := c.be.ListBuckets() + return responce(ctx, res, err) } func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { @@ -47,18 +47,18 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return errors.New("wrong api call") } - res, code := c.be.ListObjectParts(bucket, "", uploadId, partNumberMarker, maxParts) - return responce(ctx, res, code) + res, err := c.be.ListObjectParts(bucket, "", uploadId, partNumberMarker, maxParts) + return responce(ctx, res, err) } if ctx.Request().URI().QueryArgs().Has("acl") { - res, code := c.be.GetObjectAcl(bucket, key) - return responce(ctx, res, code) + res, err := c.be.GetObjectAcl(bucket, key) + return responce(ctx, res, err) } if attrs := ctx.Get("X-Amz-Object-Attributes"); attrs != "" { - res, code := c.be.GetObjectAttributes(bucket, key, strings.Split(attrs, ",")) - return responce(ctx, res, code) + res, err := c.be.GetObjectAttributes(bucket, key, strings.Split(attrs, ",")) + return responce(ctx, res, err) } bRangeSl := strings.Split(ctx.Get("Range"), "=") @@ -81,28 +81,28 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return errors.New("wrong api call") } - res, code := c.be.GetObject(bucket, key, int64(startOffset), int64(length), ctx.Response().BodyWriter(), "") - return responce(ctx, res, code) + res, err := c.be.GetObject(bucket, key, int64(startOffset), int64(length), ctx.Response().BodyWriter(), "") + return responce(ctx, res, err) } func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { if ctx.Request().URI().QueryArgs().Has("acl") { - res, code := c.be.GetBucketAcl(ctx.Params("bucket")) - return responce(ctx, res, code) + res, err := c.be.GetBucketAcl(ctx.Params("bucket")) + return responce(ctx, res, err) } if ctx.Request().URI().QueryArgs().Has("uploads") { - res, code := c.be.ListMultipartUploads(&s3.ListMultipartUploadsInput{Bucket: aws.String(ctx.Params("bucket"))}) - return responce(ctx, res, code) + res, err := c.be.ListMultipartUploads(&s3.ListMultipartUploadsInput{Bucket: aws.String(ctx.Params("bucket"))}) + return responce(ctx, res, err) } if ctx.QueryInt("list-type") == 2 { - res, code := c.be.ListObjectsV2(ctx.Params("bucket"), "", "", "", 1) - return responce(ctx, res, code) + res, err := c.be.ListObjectsV2(ctx.Params("bucket"), "", "", "", 1) + return responce(ctx, res, err) } - res, code := c.be.ListObjects(ctx.Params("bucket"), "", "", "", 1) - return responce(ctx, res, code) + res, err := c.be.ListObjects(ctx.Params("bucket"), "", "", "", 1) + return responce(ctx, res, err) } func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { @@ -121,7 +121,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { if grants != "" && acl != "" { return errors.New("wrong api call") } - code := c.be.PutBucketAcl(&s3.PutBucketAclInput{ + err := c.be.PutBucketAcl(&s3.PutBucketAclInput{ Bucket: &bucket, ACL: types.BucketCannedACL(acl), GrantFullControl: &grantFullControl, @@ -131,11 +131,11 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { GrantWriteACP: &grantWriteACP, }) - return responce[any](ctx, nil, code) + return responce[any](ctx, nil, err) } - code := c.be.PutBucket(bucket) - return responce[any](ctx, nil, code) + err := c.be.PutBucket(bucket) + return responce[any](ctx, nil, err) } func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { @@ -180,7 +180,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return errors.New("wrong api call") } - res, code := c.be.UploadPartCopy(&s3.UploadPartCopyInput{ + res, err := c.be.UploadPartCopy(&s3.UploadPartCopyInput{ Bucket: &dstBucket, Key: &dstKeyStart, PartNumber: int32(partNumber), @@ -192,13 +192,13 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { CopySourceIfUnmodifiedSince: ©SrcUnmodifSinceDate, }) - return responce(ctx, res, code) + return responce(ctx, res, err) } if uploadId != "" { body := io.ReadSeeker(bytes.NewReader([]byte(ctx.Body()))) - res, code := c.be.UploadPart(dstBucket, dstKeyStart, uploadId, body) - return responce(ctx, res, code) + res, err := c.be.UploadPart(dstBucket, dstKeyStart, uploadId, body) + return responce(ctx, res, err) } if grants != "" || acl != "" { @@ -206,7 +206,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return errors.New("wrong api call") } - code := c.be.PutObjectAcl(&s3.PutObjectAclInput{ + err := c.be.PutObjectAcl(&s3.PutObjectAclInput{ Bucket: &dstBucket, Key: &dstKeyStart, ACL: types.ObjectCannedACL(acl), @@ -216,24 +216,24 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { GrantWrite: &granWrite, GrantWriteACP: &grantWriteACP, }) - return responce[any](ctx, nil, code) + return responce[any](ctx, nil, err) } if copySource != "" { copySourceSplit := strings.Split(copySource, "/") srcBucket, srcObject := copySourceSplit[0], copySourceSplit[1:] - res, code := c.be.CopyObject(srcBucket, strings.Join(srcObject, "/"), dstBucket, dstKeyStart) - return responce(ctx, res, code) + res, err := c.be.CopyObject(srcBucket, strings.Join(srcObject, "/"), dstBucket, dstKeyStart) + return responce(ctx, res, err) } - res, code := c.be.PutObject(dstBucket, dstKeyStart, bytes.NewReader(ctx.Request().Body())) - return responce(ctx, res, code) + res, err := c.be.PutObject(dstBucket, dstKeyStart, bytes.NewReader(ctx.Request().Body())) + return responce(ctx, res, err) } func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) error { - code := c.be.DeleteBucket(ctx.Params("bucket")) - return responce[any](ctx, nil, code) + err := c.be.DeleteBucket(ctx.Params("bucket")) + return responce[any](ctx, nil, err) } func (c S3ApiController) DeleteObjects(ctx *fiber.Ctx) error { @@ -242,8 +242,8 @@ func (c S3ApiController) DeleteObjects(ctx *fiber.Ctx) error { return errors.New("wrong api call") } - code := c.be.DeleteObjects(ctx.Params("bucket"), &s3.DeleteObjectsInput{Delete: &dObj}) - return responce[any](ctx, nil, code) + err := c.be.DeleteObjects(ctx.Params("bucket"), &s3.DeleteObjectsInput{Delete: &dObj}) + return responce[any](ctx, nil, err) } func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { @@ -256,23 +256,23 @@ func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { if uploadId != "" { expectedBucketOwner, requestPayer := ctx.Get("X-Amz-Expected-Bucket-Owner"), ctx.Get("X-Amz-Request-Payer") - code := c.be.AbortMultipartUpload(&s3.AbortMultipartUploadInput{ + err := c.be.AbortMultipartUpload(&s3.AbortMultipartUploadInput{ UploadId: &uploadId, Bucket: &bucket, Key: &key, ExpectedBucketOwner: &expectedBucketOwner, RequestPayer: types.RequestPayer(requestPayer), }) - return responce[any](ctx, nil, code) + return responce[any](ctx, nil, err) } - code := c.be.DeleteObject(bucket, key) - return responce[any](ctx, nil, code) + err := c.be.DeleteObject(bucket, key) + return responce[any](ctx, nil, err) } func (c S3ApiController) HeadBucket(ctx *fiber.Ctx) error { - res, code := c.be.HeadBucket(ctx.Params("bucket")) - return responce(ctx, res, code) + res, err := c.be.HeadBucket(ctx.Params("bucket")) + return responce(ctx, res, err) } func (c S3ApiController) HeadObject(ctx *fiber.Ctx) error { @@ -281,8 +281,8 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) error { key = strings.Join([]string{key, keyEnd}, "/") } - res, code := c.be.HeadObject(bucket, key, "") - return responce(ctx, res, code) + res, err := c.be.HeadObject(bucket, key, "") + return responce(ctx, res, err) } func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { @@ -294,8 +294,8 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { } if err := xml.Unmarshal(ctx.Body(), &restoreRequest); err == nil { - code := c.be.RestoreObject(bucket, key, &restoreRequest) - return responce[any](ctx, nil, code) + err := c.be.RestoreObject(bucket, key, &restoreRequest) + return responce[any](ctx, nil, err) } if uploadId != "" { @@ -305,21 +305,28 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { return errors.New("wrong api call") } - res, code := c.be.CompleteMultipartUpload(bucket, "", uploadId, parts) - return responce(ctx, res, code) + res, err := c.be.CompleteMultipartUpload(bucket, "", uploadId, parts) + return responce(ctx, res, err) } - res, code := c.be.CreateMultipartUpload(&s3.CreateMultipartUploadInput{Bucket: &bucket, Key: &key}) - return responce(ctx, res, code) + res, err := c.be.CreateMultipartUpload(&s3.CreateMultipartUploadInput{Bucket: &bucket, Key: &key}) + return responce(ctx, res, err) } -func responce[R comparable](ctx *fiber.Ctx, resp R, code s3err.ErrorCode) error { - if code != 0 { - err := s3err.GetAPIError(code) - ctx.Status(err.HTTPStatusCode) - return ctx.Send(s3err.GetAPIErrorResponse(err, "", "", "")) - } else if b, err := xml.Marshal(resp); err != nil { - return err - } else { - return ctx.Send(b) +func responce[R comparable](ctx *fiber.Ctx, resp R, err error) error { + if err != nil { + serr, ok := err.(s3err.APIError) + if ok { + ctx.Status(serr.HTTPStatusCode) + return ctx.Send(s3err.GetAPIErrorResponse(serr, "", "", "")) + } + return ctx.Send(s3err.GetAPIErrorResponse( + s3err.GetAPIError(s3err.ErrInternalError), "", "", "")) } + + var b []byte + if b, err = xml.Marshal(resp); err != nil { + return err + } + + return ctx.Send(b) } diff --git a/s3err/s3err.go b/s3err/s3err.go index ca16eb0..7ac899b 100644 --- a/s3err/s3err.go +++ b/s3err/s3err.go @@ -26,12 +26,12 @@ type APIErrorResponse struct { HostID string `xml:"HostId" json:"HostId"` } -func (A APIError) Error() []byte { +func (A APIError) Error() string { var bytesBuffer bytes.Buffer bytesBuffer.WriteString(xml.Header) e := xml.NewEncoder(&bytesBuffer) _ = e.Encode(A) - return bytesBuffer.Bytes() + return bytesBuffer.String() } // ErrorCode type of error status.