// Credits: https://pkg.go.dev/github.com/rclone/[email protected]/cmd/serve/s3 | |
// Package s3 implements a fake s3 server for alist | |
package s3 | |
import ( | |
"path" | |
"strings" | |
"github.com/Mikubill/gofakes3" | |
) | |
func (b *s3Backend) entryListR(bucket, fdPath, name string, addPrefix bool, response *gofakes3.ObjectList) error { | |
fp := path.Join(bucket, fdPath) | |
dirEntries, err := getDirEntries(fp) | |
if err != nil { | |
return err | |
} | |
for _, entry := range dirEntries { | |
object := entry.GetName() | |
// workround for control-chars detect | |
objectPath := path.Join(fdPath, object) | |
if !strings.HasPrefix(object, name) { | |
continue | |
} | |
if entry.IsDir() { | |
if addPrefix { | |
// response.AddPrefix(gofakes3.URLEncode(objectPath)) | |
response.AddPrefix(objectPath) | |
continue | |
} | |
err := b.entryListR(bucket, path.Join(fdPath, object), "", false, response) | |
if err != nil { | |
return err | |
} | |
} else { | |
item := &gofakes3.Content{ | |
// Key: gofakes3.URLEncode(objectPath), | |
Key: objectPath, | |
LastModified: gofakes3.NewContentTime(entry.ModTime()), | |
ETag: getFileHash(entry), | |
Size: entry.GetSize(), | |
StorageClass: gofakes3.StorageStandard, | |
} | |
response.Add(item) | |
} | |
} | |
return nil | |
} | |