Simple S3-like server for development purposes, written in Go

Fix response when listing returns zero contents

Changed files
+17 -12
+6 -4
responses.go
··· 29 29 30 30 // https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html 31 31 type ListBucketResult struct { 32 - XMLName xml.Name `xml:"ListBucketResult"` 33 - Name string `xml:"Name"` 34 - Prefix string `xml:"Prefix"` 35 - Contents []Object `xml:"Contents"` 32 + XMLName xml.Name `xml:"ListBucketResult"` 33 + Name string `xml:"Name"` 34 + Prefix string `xml:"Prefix"` 35 + KeyCount int64 `xml:"KeyCount"` 36 + IsTruncated bool `xml:"IsTruncated"` 37 + Contents []Object `xml:"Contents"` 36 38 }
+11 -8
server.go
··· 53 53 path := filepath.Join(bucketName, subpath) 54 54 files, err := fs.ReadDir(root.FS(), path) 55 55 if err != nil { 56 - return ListBucketResult{}, err 56 + if errors.Is(err, fs.ErrNotExist) { 57 + return ListBucketResult{KeyCount: 0, IsTruncated: false, Prefix: prefix}, nil 58 + } else { 59 + return ListBucketResult{}, err 60 + } 57 61 } 58 62 59 63 var objects []Object ··· 77 81 }) 78 82 } 79 83 } 84 + 80 85 result := ListBucketResult{ 81 - Contents: objects, 86 + KeyCount: int64(len(objects)), 87 + IsTruncated: false, 88 + Prefix: prefix, 89 + Contents: objects, 82 90 } 83 91 return result, nil 84 92 } ··· 145 153 146 154 result, err := listObjects(root, bucketName, r.URL.Query().Get("prefix")) 147 155 if err != nil { 148 - // FIXME: I think this should always return 200 anyways 149 - if errors.Is(err, fs.ErrNotExist) { 150 - http.Error(w, err.Error(), http.StatusNotFound) 151 - } else { 152 - http.Error(w, err.Error(), http.StatusInternalServerError) 153 - } 156 + http.Error(w, err.Error(), http.StatusInternalServerError) 154 157 return 155 158 } 156 159