s3API working with listing objects

This commit is contained in:
Chris Lu
2018-07-23 01:55:26 -07:00
parent 3c7ffa2a2c
commit 6039b25bc9

View File

@@ -12,6 +12,8 @@ import (
"path/filepath" "path/filepath"
"strconv" "strconv"
"time" "time"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/aws"
) )
const ( const (
@@ -26,6 +28,8 @@ func (s3a *S3ApiServer) ListObjectsV2Handler(w http.ResponseWriter, r *http.Requ
vars := mux.Vars(r) vars := mux.Vars(r)
bucket := vars["bucket"] bucket := vars["bucket"]
glog.V(4).Infof("read v2: %v", vars)
originalPrefix, marker, startAfter, delimiter, _, maxKeys := getListObjectsV2Args(r.URL.Query()) originalPrefix, marker, startAfter, delimiter, _, maxKeys := getListObjectsV2Args(r.URL.Query())
if maxKeys < 0 { if maxKeys < 0 {
@@ -80,7 +84,7 @@ func (s3a *S3ApiServer) ListObjectsV1Handler(w http.ResponseWriter, r *http.Requ
writeSuccessResponseXML(w, encodeResponse(response)) writeSuccessResponseXML(w, encodeResponse(response))
} }
func (s3a *S3ApiServer) listFilerEntries(bucket, originalPrefix string, maxKeys int, marker string) (response ListBucketResponse, err error) { func (s3a *S3ApiServer) listFilerEntries(bucket, originalPrefix string, maxKeys int, marker string) (response *s3.ListObjectsOutput, err error) {
// convert full path prefix into directory name and prefix for entry name // convert full path prefix into directory name and prefix for entry name
dir, prefix := filepath.Split(originalPrefix) dir, prefix := filepath.Split(originalPrefix)
@@ -96,14 +100,13 @@ func (s3a *S3ApiServer) listFilerEntries(bucket, originalPrefix string, maxKeys
InclusiveStartFrom: false, InclusiveStartFrom: false,
} }
glog.V(4).Infof("read directory: %v", request)
resp, err := client.ListEntries(context.Background(), request) resp, err := client.ListEntries(context.Background(), request)
if err != nil { if err != nil {
return fmt.Errorf("list buckets: %v", err) return fmt.Errorf("list buckets: %v", err)
} }
var contents []ListEntry var contents []*s3.Object
var commonPrefixes []PrefixEntry var commonPrefixes []*s3.CommonPrefix
var counter int var counter int
var lastEntryName string var lastEntryName string
var isTruncated bool var isTruncated bool
@@ -115,37 +118,38 @@ func (s3a *S3ApiServer) listFilerEntries(bucket, originalPrefix string, maxKeys
} }
lastEntryName = entry.Name lastEntryName = entry.Name
if entry.IsDirectory { if entry.IsDirectory {
commonPrefixes = append(commonPrefixes, PrefixEntry{ commonPrefixes = append(commonPrefixes, &s3.CommonPrefix{
Prefix: fmt.Sprintf("%s%s/", dir, entry.Name), Prefix: aws.String(fmt.Sprintf("%s%s/", dir, entry.Name)),
}) })
} else { } else {
contents = append(contents, ListEntry{ contents = append(contents, &s3.Object{
Key: fmt.Sprintf("%s%s", dir, entry.Name), Key: aws.String(fmt.Sprintf("%s%s", dir, entry.Name)),
LastModified: time.Unix(entry.Attributes.Mtime, 0), LastModified: aws.Time(time.Unix(entry.Attributes.Mtime, 0)),
ETag: "", // TODO add etag ETag: aws.String("\"2345sgfwetrewrt\""), // TODO add etag
Size: int64(filer2.TotalSize(entry.Chunks)), Size: aws.Int64(int64(filer2.TotalSize(entry.Chunks))),
Owner: CanonicalUser{ Owner: &s3.Owner{
ID: fmt.Sprintf("%d", entry.Attributes.Uid), ID: aws.String("bcaf161ca5fb16fd081034f"),
DisplayName: aws.String("webfile"),
}, },
StorageClass: StorageClass("STANDARD"), StorageClass: aws.String("STANDARD"),
}) })
} }
} }
response = ListBucketResponse{ response = &s3.ListObjectsOutput{
ListBucketResponse: ListBucketResult{ Name: aws.String(bucket),
Name: bucket, Prefix: aws.String(originalPrefix),
Prefix: originalPrefix, Marker: aws.String(marker),
Marker: marker, NextMarker: aws.String(lastEntryName),
NextMarker: lastEntryName, MaxKeys: aws.Int64(int64(maxKeys)),
MaxKeys: maxKeys, Delimiter: aws.String("/"),
Delimiter: "/", IsTruncated: aws.Bool(isTruncated),
IsTruncated: isTruncated, Contents: contents,
Contents: contents, CommonPrefixes: commonPrefixes,
CommonPrefixes: commonPrefixes,
},
} }
glog.V(4).Infof("read directory: %v, found: %v", request, counter)
return nil return nil
}) })