Spaces:
Paused
Paused
| // Credits: https://pkg.go.dev/github.com/rclone/rclone@v1.65.2/cmd/serve/s3 | |
| // Package s3 implements a fake s3 server for alist | |
| package s3 | |
| import ( | |
| "sort" | |
| "github.com/Mikubill/gofakes3" | |
| ) | |
| // pager splits the object list into smulitply pages. | |
| func (db *s3Backend) pager(list *gofakes3.ObjectList, page gofakes3.ListBucketPage) (*gofakes3.ObjectList, error) { | |
| // sort by alphabet | |
| sort.Slice(list.CommonPrefixes, func(i, j int) bool { | |
| return list.CommonPrefixes[i].Prefix < list.CommonPrefixes[j].Prefix | |
| }) | |
| // sort by modtime | |
| sort.Slice(list.Contents, func(i, j int) bool { | |
| return list.Contents[i].LastModified.Before(list.Contents[j].LastModified.Time) | |
| }) | |
| tokens := page.MaxKeys | |
| if tokens == 0 { | |
| tokens = 1000 | |
| } | |
| if page.HasMarker { | |
| for i, obj := range list.Contents { | |
| if obj.Key == page.Marker { | |
| list.Contents = list.Contents[i+1:] | |
| break | |
| } | |
| } | |
| for i, obj := range list.CommonPrefixes { | |
| if obj.Prefix == page.Marker { | |
| list.CommonPrefixes = list.CommonPrefixes[i+1:] | |
| break | |
| } | |
| } | |
| } | |
| response := gofakes3.NewObjectList() | |
| for _, obj := range list.CommonPrefixes { | |
| if tokens <= 0 { | |
| break | |
| } | |
| response.AddPrefix(obj.Prefix) | |
| tokens-- | |
| } | |
| for _, obj := range list.Contents { | |
| if tokens <= 0 { | |
| break | |
| } | |
| response.Add(obj) | |
| tokens-- | |
| } | |
| if len(list.CommonPrefixes)+len(list.Contents) > int(page.MaxKeys) { | |
| response.IsTruncated = true | |
| if len(response.Contents) > 0 { | |
| response.NextMarker = response.Contents[len(response.Contents)-1].Key | |
| } else { | |
| response.NextMarker = response.CommonPrefixes[len(response.CommonPrefixes)-1].Prefix | |
| } | |
| } | |
| return response, nil | |
| } | |