mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2025-01-19 23:24:33 +08:00
feat: add support for S3 ListObjects and ListObjectsV2 (#5350)
This commit is contained in:
parent
872b5161e6
commit
3e3e0fa240
@ -47,10 +47,6 @@ func (s3a *S3ApiServer) ListObjectsV2Handler(w http.ResponseWriter, r *http.Requ
|
||||
s3err.WriteErrorResponse(w, r, s3err.ErrInvalidMaxKeys)
|
||||
return
|
||||
}
|
||||
if delimiter != "" && delimiter != "/" {
|
||||
s3err.WriteErrorResponse(w, r, s3err.ErrNotImplemented)
|
||||
return
|
||||
}
|
||||
|
||||
marker := continuationToken
|
||||
if continuationToken == "" {
|
||||
@ -103,10 +99,6 @@ func (s3a *S3ApiServer) ListObjectsV1Handler(w http.ResponseWriter, r *http.Requ
|
||||
s3err.WriteErrorResponse(w, r, s3err.ErrInvalidMaxKeys)
|
||||
return
|
||||
}
|
||||
if delimiter != "" && delimiter != "/" {
|
||||
s3err.WriteErrorResponse(w, r, s3err.ErrNotImplemented)
|
||||
return
|
||||
}
|
||||
|
||||
response, err := s3a.listFilerEntries(bucket, originalPrefix, maxKeys, marker, delimiter)
|
||||
|
||||
@ -171,6 +163,34 @@ func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, m
|
||||
cursor.maxKeys--
|
||||
}
|
||||
} else {
|
||||
var delimiterFound bool
|
||||
if delimiter != "" {
|
||||
// keys that contain the same string between the prefix and the first occurrence of the delimiter are grouped together as a commonPrefix.
|
||||
// extract the string between the prefix and the delimiter and add it to the commonPrefixes if it's unique.
|
||||
fullPath := fmt.Sprintf("%s/%s", dir, entry.Name)[len(bucketPrefix):]
|
||||
delimitedPath := strings.SplitN(fullPath, delimiter, 2)
|
||||
if len(delimitedPath) == 2 {
|
||||
|
||||
// S3 clients expect the delimited prefix to contain the delimiter.
|
||||
delimitedPrefix := delimitedPath[0] + delimiter
|
||||
|
||||
for i := range commonPrefixes {
|
||||
if commonPrefixes[i].Prefix == delimitedPrefix {
|
||||
delimiterFound = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !delimiterFound {
|
||||
commonPrefixes = append(commonPrefixes, PrefixEntry{
|
||||
Prefix: delimitedPrefix,
|
||||
})
|
||||
cursor.maxKeys--
|
||||
delimiterFound = true
|
||||
}
|
||||
}
|
||||
}
|
||||
if !delimiterFound {
|
||||
storageClass := "STANDARD"
|
||||
if v, ok := entry.Extended[s3_constants.AmzStorageClass]; ok {
|
||||
storageClass = string(v)
|
||||
@ -188,6 +208,7 @@ func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, m
|
||||
})
|
||||
cursor.maxKeys--
|
||||
}
|
||||
}
|
||||
})
|
||||
if doErr != nil {
|
||||
return doErr
|
||||
|
Loading…
Reference in New Issue
Block a user