diff --git a/cmd/api-response.go b/cmd/api-response.go
index da194031c..190fab8f4 100644
--- a/cmd/api-response.go
+++ b/cmd/api-response.go
@@ -85,7 +85,7 @@ type ListVersionsResponse struct {
VersionIDMarker string `xml:"VersionIdMarker"`
MaxKeys int
- Delimiter string
+ Delimiter string `xml:"Delimiter,omitempty"`
// A flag that indicates whether or not ListObjects returned all of the results
// that satisfied the search criteria.
IsTruncated bool
@@ -115,7 +115,7 @@ type ListObjectsResponse struct {
NextMarker string `xml:"NextMarker,omitempty"`
MaxKeys int
- Delimiter string
+ Delimiter string `xml:"Delimiter,omitempty"`
// A flag that indicates whether or not ListObjects returned all of the results
// that satisfied the search criteria.
IsTruncated bool
@@ -146,7 +146,7 @@ type ListObjectsV2Response struct {
KeyCount int
MaxKeys int
- Delimiter string
+ Delimiter string `xml:"Delimiter,omitempty"`
// A flag that indicates whether or not ListObjects returned all of the results
// that satisfied the search criteria.
IsTruncated bool
@@ -205,7 +205,7 @@ type ListMultipartUploadsResponse struct {
UploadIDMarker string `xml:"UploadIdMarker"`
NextKeyMarker string
NextUploadIDMarker string `xml:"NextUploadIdMarker"`
- Delimiter string
+ Delimiter string `xml:"Delimiter,omitempty"`
Prefix string
EncodingType string `xml:"EncodingType,omitempty"`
MaxUploads int
@@ -360,7 +360,7 @@ type Object struct {
Size int64
// Owner of the object.
- Owner Owner
+ Owner *Owner `xml:"Owner,omitempty"`
// The class of storage used to store the object.
StorageClass string
@@ -506,7 +506,7 @@ func generateListBucketsResponse(buckets []BucketInfo) ListBucketsResponse {
func generateListVersionsResponse(bucket, prefix, marker, versionIDMarker, delimiter, encodingType string, maxKeys int, resp ListObjectVersionsInfo, metadata metaCheckFn) ListVersionsResponse {
versions := make([]ObjectVersion, 0, len(resp.Objects))
- owner := Owner{
+ owner := &Owner{
ID: globalMinioDefaultOwnerID,
DisplayName: "minio",
}
@@ -602,7 +602,7 @@ func generateListVersionsResponse(bucket, prefix, marker, versionIDMarker, delim
// generates an ListObjectsV1 response for the said bucket with other enumerated options.
func generateListObjectsV1Response(bucket, prefix, marker, delimiter, encodingType string, maxKeys int, resp ListObjectsInfo) ListObjectsResponse {
contents := make([]Object, 0, len(resp.Objects))
- owner := Owner{
+ owner := &Owner{
ID: globalMinioDefaultOwnerID,
DisplayName: "minio",
}
@@ -651,10 +651,14 @@ func generateListObjectsV1Response(bucket, prefix, marker, delimiter, encodingTy
// generates an ListObjectsV2 response for the said bucket with other enumerated options.
func generateListObjectsV2Response(bucket, prefix, token, nextToken, startAfter, delimiter, encodingType string, fetchOwner, isTruncated bool, maxKeys int, objects []ObjectInfo, prefixes []string, metadata metaCheckFn) ListObjectsV2Response {
contents := make([]Object, 0, len(objects))
- owner := Owner{
- ID: globalMinioDefaultOwnerID,
- DisplayName: "minio",
+ var owner *Owner
+ if fetchOwner {
+ owner = &Owner{
+ ID: globalMinioDefaultOwnerID,
+ DisplayName: "minio",
+ }
}
+
data := ListObjectsV2Response{}
for _, object := range objects {
diff --git a/cmd/bucket-listobjects-handlers.go b/cmd/bucket-listobjects-handlers.go
index 56af2b9d9..b1c91e098 100644
--- a/cmd/bucket-listobjects-handlers.go
+++ b/cmd/bucket-listobjects-handlers.go
@@ -190,7 +190,6 @@ func (api objectAPIHandlers) listObjectsV2Handler(ctx context.Context, w http.Re
}
// Validate the query params before beginning to serve the request.
- // fetch-owner is not validated since it is a boolean
if s3Error := validateListObjectsArgs(prefix, token, delimiter, encodingType, maxKeys); s3Error != ErrNone {
writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL)
return
diff --git a/cmd/generic-handlers.go b/cmd/generic-handlers.go
index 777c937a7..77f9e06c3 100644
--- a/cmd/generic-handlers.go
+++ b/cmd/generic-handlers.go
@@ -356,7 +356,10 @@ func setRequestValidityHandler(h http.Handler) http.Handler {
return
}
// Check for bad components in URL query values.
- for _, vv := range r.Form {
+ for k, vv := range r.Form {
+ if k == "delimiter" { // delimiters are allowed to have `.` or `..`
+ continue
+ }
for _, v := range vv {
if hasBadPathComponent(v) {
if ok {
diff --git a/cmd/server_test.go b/cmd/server_test.go
index 418823a86..8463593bc 100644
--- a/cmd/server_test.go
+++ b/cmd/server_test.go
@@ -1608,7 +1608,6 @@ func (s *TestSuiteCommon) TestListObjectsHandler(c *check) {
[]string{
"foo bar 1",
"foo bar 2",
- fmt.Sprintf("%sminio", globalMinioDefaultOwnerID),
},
},
{