Skip to content

Commit 7fa4a97

Browse files
committed
feat: sync recent posix changes to scoutfs
1 parent ff80b90 commit 7fa4a97

File tree

2 files changed

+281
-275
lines changed

2 files changed

+281
-275
lines changed

backend/posix/posix.go

+20-13
Original file line numberDiff line numberDiff line change
@@ -1264,7 +1264,7 @@ func (p *Posix) CreateMultipartUpload(ctx context.Context, mpu s3response.Create
12641264
}
12651265
}
12661266

1267-
err = p.storeObjectMetadata(nil, bucket, filepath.Join(objdir, uploadID), ObjectMetadata{
1267+
err = p.storeObjectMetadata(nil, bucket, filepath.Join(objdir, uploadID), objectMetadata{
12681268
ContentType: mpu.ContentType,
12691269
ContentEncoding: mpu.ContentEncoding,
12701270
ContentDisposition: mpu.ContentDisposition,
@@ -1540,7 +1540,7 @@ func (p *Posix) CompleteMultipartUpload(ctx context.Context, input *s3.CompleteM
15401540
upiddir := filepath.Join(objdir, uploadID)
15411541

15421542
userMetaData := make(map[string]string)
1543-
objMeta := p.loadObjectMetaData(bucket, upiddir, userMetaData)
1543+
objMeta := p.loadObjectMetaData(bucket, upiddir, nil, userMetaData)
15441544
err = p.storeObjectMetadata(f.File(), bucket, object, objMeta)
15451545
if err != nil {
15461546
return nil, err
@@ -1822,7 +1822,7 @@ func (p *Posix) retrieveUploadId(bucket, object string) (string, [32]byte, error
18221822
return entries[0].Name(), sum, nil
18231823
}
18241824

1825-
type ObjectMetadata struct {
1825+
type objectMetadata struct {
18261826
ContentType *string
18271827
ContentEncoding *string
18281828
ContentDisposition *string
@@ -1833,10 +1833,10 @@ type ObjectMetadata struct {
18331833

18341834
// fill out the user metadata map with the metadata for the object
18351835
// and return object meta properties as `ObjectMetadata`
1836-
func (p *Posix) loadObjectMetaData(bucket, object string, m map[string]string) ObjectMetadata {
1836+
func (p *Posix) loadObjectMetaData(bucket, object string, fi *os.FileInfo, m map[string]string) objectMetadata {
18371837
ents, err := p.meta.ListAttributes(bucket, object)
18381838
if err != nil || len(ents) == 0 {
1839-
return ObjectMetadata{}
1839+
return objectMetadata{}
18401840
}
18411841

18421842
if m != nil {
@@ -1856,13 +1856,20 @@ func (p *Posix) loadObjectMetaData(bucket, object string, m map[string]string) O
18561856
}
18571857
}
18581858

1859-
var result ObjectMetadata
1859+
var result objectMetadata
18601860

18611861
b, err := p.meta.RetrieveAttribute(nil, bucket, object, contentTypeHdr)
18621862
if err == nil {
18631863
result.ContentType = backend.GetPtrFromString(string(b))
18641864
}
18651865

1866+
if (result.ContentType == nil || *result.ContentType == "") && fi != nil {
1867+
if (*fi).IsDir() {
1868+
// this is the media type for directories in AWS and Nextcloud
1869+
result.ContentType = backend.GetPtrFromString("application/x-directory")
1870+
}
1871+
}
1872+
18661873
b, err = p.meta.RetrieveAttribute(nil, bucket, object, contentEncHdr)
18671874
if err == nil {
18681875
result.ContentEncoding = backend.GetPtrFromString(string(b))
@@ -1891,7 +1898,7 @@ func (p *Posix) loadObjectMetaData(bucket, object string, m map[string]string) O
18911898
return result
18921899
}
18931900

1894-
func (p *Posix) storeObjectMetadata(f *os.File, bucket, object string, m ObjectMetadata) error {
1901+
func (p *Posix) storeObjectMetadata(f *os.File, bucket, object string, m objectMetadata) error {
18951902
if getString(m.ContentType) != "" {
18961903
err := p.meta.StoreAttribute(f, bucket, object, contentTypeHdr, []byte(*m.ContentType))
18971904
if err != nil {
@@ -2252,7 +2259,7 @@ func (p *Posix) ListParts(ctx context.Context, input *s3.ListPartsInput) (s3resp
22522259

22532260
userMetaData := make(map[string]string)
22542261
upiddir := filepath.Join(objdir, uploadID)
2255-
p.loadObjectMetaData(bucket, upiddir, userMetaData)
2262+
p.loadObjectMetaData(bucket, upiddir, nil, userMetaData)
22562263

22572264
return s3response.ListPartsResult{
22582265
Bucket: bucket,
@@ -2914,7 +2921,7 @@ func (p *Posix) PutObject(ctx context.Context, po s3response.PutObjectInput) (s3
29142921
return s3response.PutObjectOutput{}, fmt.Errorf("set etag attr: %w", err)
29152922
}
29162923

2917-
err = p.storeObjectMetadata(f.File(), *po.Bucket, *po.Key, ObjectMetadata{
2924+
err = p.storeObjectMetadata(f.File(), *po.Bucket, *po.Key, objectMetadata{
29182925
ContentType: po.ContentType,
29192926
ContentEncoding: po.ContentEncoding,
29202927
ContentLanguage: po.ContentLanguage,
@@ -3447,7 +3454,7 @@ func (p *Posix) GetObject(_ context.Context, input *s3.GetObjectInput) (*s3.GetO
34473454
if fi.IsDir() {
34483455
userMetaData := make(map[string]string)
34493456

3450-
objMeta := p.loadObjectMetaData(bucket, object, userMetaData)
3457+
objMeta := p.loadObjectMetaData(bucket, object, &fi, userMetaData)
34513458
b, err := p.meta.RetrieveAttribute(nil, bucket, object, etagkey)
34523459
etag := string(b)
34533460
if err != nil {
@@ -3497,7 +3504,7 @@ func (p *Posix) GetObject(_ context.Context, input *s3.GetObjectInput) (*s3.GetO
34973504

34983505
userMetaData := make(map[string]string)
34993506

3500-
objMeta := p.loadObjectMetaData(bucket, object, userMetaData)
3507+
objMeta := p.loadObjectMetaData(bucket, object, &fi, userMetaData)
35013508

35023509
b, err := p.meta.RetrieveAttribute(nil, bucket, object, etagkey)
35033510
etag := string(b)
@@ -3708,7 +3715,7 @@ func (p *Posix) HeadObject(ctx context.Context, input *s3.HeadObjectInput) (*s3.
37083715
}
37093716

37103717
userMetaData := make(map[string]string)
3711-
objMeta := p.loadObjectMetaData(bucket, object, userMetaData)
3718+
objMeta := p.loadObjectMetaData(bucket, object, &fi, userMetaData)
37123719

37133720
b, err := p.meta.RetrieveAttribute(nil, bucket, object, etagkey)
37143721
etag := string(b)
@@ -3901,7 +3908,7 @@ func (p *Posix) CopyObject(ctx context.Context, input *s3.CopyObjectInput) (*s3.
39013908
}
39023909

39033910
mdmap := make(map[string]string)
3904-
p.loadObjectMetaData(srcBucket, srcObject, mdmap)
3911+
p.loadObjectMetaData(srcBucket, srcObject, &fi, mdmap)
39053912

39063913
var etag string
39073914
var version *string

0 commit comments

Comments
 (0)