Make PutObject a nop for an object which ends with "/" and size is '0' (#3603)

This helps majority of S3 compatible applications while not returning
an error upon directory create request.

Fixes #2965
This commit is contained in:
Harshavardhana
2017-01-20 16:33:01 -08:00
committed by GitHub
parent c3f7d1026f
commit 51fa4f7fe3
7 changed files with 100 additions and 21 deletions

View File

@@ -22,6 +22,7 @@ import (
"runtime"
"strings"
"sync"
"time"
humanize "github.com/dustin/go-humanize"
)
@@ -54,6 +55,32 @@ func isRemoteDisk(disk StorageAPI) bool {
return ok
}
// Checks if the object is a directory, this logic uses
// if size == 0 and object ends with slashSeparator then
// returns true.
func isObjectDir(object string, size int64) bool {
return strings.HasSuffix(object, slashSeparator) && size == 0
}
// Converts just bucket, object metadata into ObjectInfo datatype.
func dirObjectInfo(bucket, object string, size int64, metadata map[string]string) ObjectInfo {
// This is a special case with size as '0' and object ends with
// a slash separator, we treat it like a valid operation and
// return success.
md5Sum := metadata["md5Sum"]
delete(metadata, "md5Sum")
return ObjectInfo{
Bucket: bucket,
Name: object,
ModTime: time.Now().UTC(),
ContentType: "application/octet-stream",
IsDir: true,
Size: size,
MD5Sum: md5Sum,
UserDefined: metadata,
}
}
// House keeping code for FS/XL and distributed Minio setup.
func houseKeeping(storageDisks []StorageAPI) error {
var wg = &sync.WaitGroup{}