diff --git a/backend/posix/posix.go b/backend/posix/posix.go index c23aca51..e23f0223 100644 --- a/backend/posix/posix.go +++ b/backend/posix/posix.go @@ -101,7 +101,7 @@ func (p *Posix) ListBuckets() (*s3.ListBucketsOutput, error) { func (p *Posix) HeadBucket(bucket string) (*s3.HeadBucketOutput, error) { _, err := os.Lstat(bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -125,7 +125,7 @@ func (p *Posix) PutBucket(bucket string) error { func (p *Posix) DeleteBucket(bucket string) error { names, err := os.ReadDir(bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -157,7 +157,7 @@ func (p *Posix) CreateMultipartUpload(mpu *s3.CreateMultipartUploadInput) (*s3.C object := *mpu.Key _, err := os.Stat(bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -205,7 +205,7 @@ func (p *Posix) CreateMultipartUpload(mpu *s3.CreateMultipartUploadInput) (*s3.C func (p *Posix) CompleteMultipartUpload(bucket, object, uploadID string, parts []types.Part) (*s3.CompleteMultipartUploadOutput, error) { _, err := os.Stat(bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -322,7 +322,7 @@ func (p *Posix) checkUploadIDExists(bucket, object, uploadID string) ([32]byte, objdir := filepath.Join(bucket, metaTmpMultipartDir, fmt.Sprintf("%x", sum)) _, err := os.Stat(filepath.Join(objdir, uploadID)) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return [32]byte{}, s3err.GetAPIError(s3err.ErrNoSuchUpload) } if err != nil { @@ -331,7 +331,7 @@ func (p *Posix) checkUploadIDExists(bucket, object, uploadID string) ([32]byte, return sum, nil } -func loadUserMetaData(path string, m map[string]string) (tag, contentType, contentEncoding string) { +func loadUserMetaData(path string, m map[string]string) (contentType, contentEncoding string) { ents, err := xattr.List(path) if err != nil || len(ents) == 0 { return @@ -351,16 +351,7 @@ func loadUserMetaData(path string, m map[string]string) (tag, contentType, conte m[strings.TrimPrefix(e, "user.")] = string(b) } - b, err := xattr.Get(path, "user."+tagHdr) - tag = string(b) - if err != nil { - tag = "" - } - if tag != "" { - m[tagHdr] = tag - } - - b, err = xattr.Get(path, "user.content-type") + b, err := xattr.Get(path, "user.content-type") contentType = string(b) if err != nil { contentType = "" @@ -470,7 +461,7 @@ func (p *Posix) AbortMultipartUpload(mpu *s3.AbortMultipartUploadInput) error { uploadID := *mpu.UploadId _, err := os.Stat(bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -498,7 +489,7 @@ func (p *Posix) ListMultipartUploads(mpu *s3.ListMultipartUploadsInput) (*s3.Lis bucket := *mpu.Bucket _, err := os.Stat(bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -588,7 +579,7 @@ func (p *Posix) ListMultipartUploads(mpu *s3.ListMultipartUploadsInput) (*s3.Lis func (p *Posix) ListObjectParts(bucket, object, uploadID string, partNumberMarker int, maxParts int) (*s3.ListPartsOutput, error) { _, err := os.Stat(bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -603,7 +594,7 @@ func (p *Posix) ListObjectParts(bucket, object, uploadID string, partNumberMarke objdir := filepath.Join(bucket, metaTmpMultipartDir, fmt.Sprintf("%x", sum)) ents, err := os.ReadDir(filepath.Join(objdir, uploadID)) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchUpload) } if err != nil { @@ -673,7 +664,7 @@ func (p *Posix) ListObjectParts(bucket, object, uploadID string, partNumberMarke func (p *Posix) PutObjectPart(bucket, object, uploadID string, part int, length int64, r io.Reader) (string, error) { _, err := os.Stat(bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return "", s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -711,7 +702,7 @@ func (p *Posix) PutObjectPart(bucket, object, uploadID string, part int, length func (p *Posix) PutObject(po *s3.PutObjectInput) (string, error) { _, err := os.Stat(*po.Bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return "", s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -783,7 +774,7 @@ func (p *Posix) PutObject(po *s3.PutObjectInput) (string, error) { func (p *Posix) DeleteObject(bucket, object string) error { _, err := os.Stat(bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -791,7 +782,7 @@ func (p *Posix) DeleteObject(bucket, object string) error { } os.Remove(filepath.Join(bucket, object)) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return s3err.GetAPIError(s3err.ErrNoSuchKey) } if err != nil { @@ -845,7 +836,7 @@ func (p *Posix) DeleteObjects(bucket string, objects *s3.DeleteObjectsInput) err func (p *Posix) GetObject(bucket, object, acceptRange string, startOffset, length int64, writer io.Writer) (*s3.GetObjectOutput, error) { _, err := os.Stat(bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -854,7 +845,7 @@ func (p *Posix) GetObject(bucket, object, acceptRange string, startOffset, lengt objPath := filepath.Join(bucket, object) fi, err := os.Stat(objPath) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchKey) } if err != nil { @@ -867,7 +858,7 @@ func (p *Posix) GetObject(bucket, object, acceptRange string, startOffset, lengt } f, err := os.Open(objPath) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchKey) } if err != nil { @@ -883,7 +874,7 @@ func (p *Posix) GetObject(bucket, object, acceptRange string, startOffset, lengt userMetaData := make(map[string]string) - _, contentType, contentEncoding := loadUserMetaData(objPath, userMetaData) + contentType, contentEncoding := loadUserMetaData(objPath, userMetaData) b, err := xattr.Get(objPath, "user.etag") etag := string(b) @@ -910,7 +901,7 @@ func (p *Posix) GetObject(bucket, object, acceptRange string, startOffset, lengt func (p *Posix) HeadObject(bucket, object string) (*s3.HeadObjectOutput, error) { _, err := os.Stat(bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -919,7 +910,7 @@ func (p *Posix) HeadObject(bucket, object string) (*s3.HeadObjectOutput, error) objPath := filepath.Join(bucket, object) fi, err := os.Stat(objPath) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchKey) } if err != nil { @@ -927,7 +918,7 @@ func (p *Posix) HeadObject(bucket, object string) (*s3.HeadObjectOutput, error) } userMetaData := make(map[string]string) - _, contentType, contentEncoding := loadUserMetaData(objPath, userMetaData) + contentType, contentEncoding := loadUserMetaData(objPath, userMetaData) b, err := xattr.Get(objPath, "user.etag") etag := string(b) @@ -947,7 +938,7 @@ func (p *Posix) HeadObject(bucket, object string) (*s3.HeadObjectOutput, error) func (p *Posix) CopyObject(srcBucket, srcObject, DstBucket, dstObject string) (*s3.CopyObjectOutput, error) { _, err := os.Stat(srcBucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -955,7 +946,7 @@ func (p *Posix) CopyObject(srcBucket, srcObject, DstBucket, dstObject string) (* } _, err = os.Stat(DstBucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -964,7 +955,7 @@ func (p *Posix) CopyObject(srcBucket, srcObject, DstBucket, dstObject string) (* objPath := filepath.Join(srcBucket, srcObject) f, err := os.Open(objPath) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchKey) } if err != nil { @@ -992,7 +983,7 @@ func (p *Posix) CopyObject(srcBucket, srcObject, DstBucket, dstObject string) (* func (p *Posix) ListObjects(bucket, prefix, marker, delim string, maxkeys int) (*s3.ListObjectsOutput, error) { _, err := os.Stat(bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -1020,7 +1011,7 @@ func (p *Posix) ListObjects(bucket, prefix, marker, delim string, maxkeys int) ( func (p *Posix) ListObjectsV2(bucket, prefix, marker, delim string, maxkeys int) (*s3.ListObjectsV2Output, error) { _, err := os.Stat(bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -1048,7 +1039,7 @@ func (p *Posix) ListObjectsV2(bucket, prefix, marker, delim string, maxkeys int) func (p *Posix) GetTags(bucket, object string) (map[string]string, error) { _, err := os.Stat(bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return nil, s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -1081,7 +1072,7 @@ func (p *Posix) getXattrTags(bucket, object string) (map[string]string, error) { func (p *Posix) SetTags(bucket, object string, tags map[string]string) error { _, err := os.Stat(bucket) - if err != nil && errors.Is(err, fs.ErrNotExist) { + if errors.Is(err, fs.ErrNotExist) { return s3err.GetAPIError(s3err.ErrNoSuchBucket) } if err != nil { @@ -1089,7 +1080,14 @@ func (p *Posix) SetTags(bucket, object string, tags map[string]string) error { } if tags == nil { - return xattr.Remove(filepath.Join(bucket, object), "user."+tagHdr) + err = xattr.Remove(filepath.Join(bucket, object), "user."+tagHdr) + if errors.Is(err, fs.ErrNotExist) { + return s3err.GetAPIError(s3err.ErrNoSuchKey) + } + if err != nil { + return fmt.Errorf("remove tags: %w", err) + } + return nil } b, err := json.Marshal(tags) diff --git a/go.mod b/go.mod index 32d30a1c..3a665e9f 100644 --- a/go.mod +++ b/go.mod @@ -5,10 +5,10 @@ go 1.20 require ( github.com/aws/aws-sdk-go-v2 v1.18.0 github.com/aws/aws-sdk-go-v2/service/s3 v1.33.1 - github.com/gofiber/fiber/v2 v2.45.0 - github.com/valyala/fasthttp v1.47.0 + github.com/gofiber/fiber/v2 v2.46.0 github.com/google/uuid v1.3.0 github.com/pkg/xattr v0.4.9 + github.com/valyala/fasthttp v1.47.0 golang.org/x/sys v0.8.0 ) @@ -25,7 +25,7 @@ require ( github.com/aws/smithy-go v1.13.5 // indirect github.com/klauspost/compress v1.16.5 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.18 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/philhofer/fwd v1.1.2 // indirect github.com/rivo/uniseg v0.4.4 // indirect diff --git a/go.sum b/go.sum index 6ab0e03f..ffd65b53 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,8 @@ github.com/aws/aws-sdk-go-v2/service/s3 v1.33.1/go.mod h1:J9kLNzEiHSeGMyN7238EjJ github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gofiber/fiber/v2 v2.45.0 h1:p4RpkJT9GAW6parBSbcNFH2ApnAuW3OzaQzbOCoDu+s= -github.com/gofiber/fiber/v2 v2.45.0/go.mod h1:DNl0/c37WLe0g92U6lx1VMQuxGUQY5V7EIaVoEsUffc= +github.com/gofiber/fiber/v2 v2.46.0 h1:wkkWotblsGVlLjXj2dpgKQAYHtXumsK/HyFugQM68Ns= +github.com/gofiber/fiber/v2 v2.46.0/go.mod h1:DNl0/c37WLe0g92U6lx1VMQuxGUQY5V7EIaVoEsUffc= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= @@ -36,8 +36,8 @@ github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQs github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= -github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=