diff --git a/cmd/erasure-object.go b/cmd/erasure-object.go index 76e4d5269..6f603564c 100644 --- a/cmd/erasure-object.go +++ b/cmd/erasure-object.go @@ -1277,6 +1277,11 @@ func (er erasureObjects) putObject(ctx context.Context, bucket string, object st if err != nil && !isErrVersionNotFound(err) && !isErrObjectNotFound(err) && !isErrReadQuorum(err) { return objInfo, err } + + // if object doesn't exist and not a replication request return error for conditional requests + if err != nil && !opts.ReplicationRequest { + return objInfo, err + } } // Validate input data size and it can never be less than -1. diff --git a/cmd/object-api-options.go b/cmd/object-api-options.go index 1e0c10a75..3da831df7 100644 --- a/cmd/object-api-options.go +++ b/cmd/object-api-options.go @@ -414,12 +414,16 @@ func putOptsFromHeaders(ctx context.Context, hdr http.Header, metadata map[strin if err != nil { return ObjectOptions{}, err } - return ObjectOptions{ + op := ObjectOptions{ ServerSideEncryption: sseKms, UserDefined: metadata, MTime: mtime, PreserveETag: etag, - }, nil + } + if _, ok := hdr[xhttp.MinIOSourceReplicationRequest]; ok { + op.ReplicationRequest = true + } + return op, nil } // default case of passing encryption headers and UserDefined metadata to backend opts, err = getDefaultOpts(hdr, false, metadata)