| // 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 | |
| } | |