in oss/lib/util.go [641:698]
func getObjectListCommon(bucket *oss.Bucket, cloudURL CloudURL, chObjects chan<- objectInfoType,
onlyCurrentDir bool, filters []filterOptionType, payerOptions []oss.Option) error {
defer close(chObjects)
pre := oss.Prefix(cloudURL.object)
marker := oss.Marker("")
//while the src object is end with "/", use object key as marker, exclude the object itself
if strings.HasSuffix(cloudURL.object, "/") {
marker = oss.Marker(cloudURL.object)
}
del := oss.Delimiter("")
if onlyCurrentDir {
del = oss.Delimiter("/")
}
listOptions := append(payerOptions, pre, marker, del, oss.MaxKeys(1000))
for {
lor, err := bucket.ListObjects(listOptions...)
if err != nil {
return err
}
for _, object := range lor.Objects {
prefix := ""
relativeKey := object.Key
index := strings.LastIndex(cloudURL.object, "/")
if index > 0 {
prefix = object.Key[:index+1]
relativeKey = object.Key[index+1:]
}
if doesSingleObjectMatchPatterns(object.Key, filters) {
if strings.ToLower(object.Type) == "symlink" {
props, err := bucket.GetObjectDetailedMeta(object.Key, payerOptions...)
if err != nil {
LogError("ossGetObjectStatRetry error info:%s\n", err.Error())
return err
}
size, err := strconv.ParseInt(props.Get(oss.HTTPHeaderContentLength), 10, 64)
if err != nil {
LogError("strconv.ParseInt error info:%s\n", err.Error())
return err
}
object.Size = size
}
chObjects <- objectInfoType{prefix, relativeKey, int64(object.Size), object.LastModified}
}
}
pre = oss.Prefix(lor.Prefix)
marker = oss.Marker(lor.NextMarker)
listOptions = append(payerOptions, pre, marker, oss.MaxKeys(1000))
if !lor.IsTruncated {
break
}
}
return nil
}