mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
Merge pull request #4478 from swordqiu/hotfix/qj-bucket-search-prefix-skip-first-object
fix: bucket list object may skip first matched object
This commit is contained in:
@@ -20,6 +20,7 @@ import (
|
||||
"io"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -276,6 +277,12 @@ func GetIBucketStats(bucket ICloudBucket) (SBucketStats, error) {
|
||||
return stats, nil
|
||||
}
|
||||
|
||||
type cloudObjectList []ICloudObject
|
||||
|
||||
func (a cloudObjectList) Len() int { return len(a) }
|
||||
func (a cloudObjectList) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
||||
func (a cloudObjectList) Less(i, j int) bool { return a[i].GetKey() < a[j].GetKey() }
|
||||
|
||||
func GetPagedObjects(bucket ICloudBucket, objectPrefix string, isRecursive bool, marker string, maxCount int) ([]ICloudObject, string, error) {
|
||||
delimiter := "/"
|
||||
if isRecursive {
|
||||
@@ -289,20 +296,22 @@ func GetPagedObjects(bucket ICloudBucket, objectPrefix string, isRecursive bool,
|
||||
if err != nil {
|
||||
return nil, "", errors.Wrap(err, "bucket.ListObjects")
|
||||
}
|
||||
// Send all common prefixes if any.
|
||||
// NOTE: prefixes are only present if the request is delimited.
|
||||
if len(result.CommonPrefixes) > 0 {
|
||||
ret = append(ret, result.CommonPrefixes...)
|
||||
}
|
||||
// Send all objects
|
||||
for i := range result.Objects {
|
||||
// if delimited, skip the first object
|
||||
if !isRecursive && result.Objects[i].GetKey() == objectPrefix {
|
||||
// if delimited, skip the first object ends with delimiter
|
||||
if !isRecursive && result.Objects[i].GetKey() == objectPrefix && strings.HasSuffix(objectPrefix, delimiter) {
|
||||
continue
|
||||
}
|
||||
ret = append(ret, result.Objects[i])
|
||||
marker = result.Objects[i].GetKey()
|
||||
}
|
||||
// Send all common prefixes if any.
|
||||
// NOTE: prefixes are only present if the request is delimited.
|
||||
if len(result.CommonPrefixes) > 0 {
|
||||
ret = append(ret, result.CommonPrefixes...)
|
||||
}
|
||||
// sort prefix by name in ascending order
|
||||
sort.Sort(cloudObjectList(ret))
|
||||
// If next marker present, save it for next request.
|
||||
if result.NextMarker != "" {
|
||||
marker = result.NextMarker
|
||||
|
||||
Reference in New Issue
Block a user