func getObjectListCommon()

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
}