mirror of
https://github.com/minio/minio.git
synced 2025-01-25 21:53:16 -05:00
support if-match/if-none-match with s3 uploads (#16551)
This commit is contained in:
parent
422c396d73
commit
11c7ecb5cf
@ -1,4 +1,4 @@
|
|||||||
// Copyright (c) 2015-2021 MinIO, Inc.
|
// Copyright (c) 2015-2023 MinIO, Inc.
|
||||||
//
|
//
|
||||||
// This file is part of MinIO Object Storage stack
|
// This file is part of MinIO Object Storage stack
|
||||||
//
|
//
|
||||||
@ -165,6 +165,30 @@ func checkPreconditionsPUT(ctx context.Context, w http.ResponseWriter, r *http.R
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If-Match : Return the object only if its entity tag (ETag) is the same as the one specified;
|
||||||
|
// otherwise return a 412 (precondition failed).
|
||||||
|
ifMatchETagHeader := r.Header.Get(xhttp.IfMatch)
|
||||||
|
if ifMatchETagHeader != "" {
|
||||||
|
if !isETagEqual(objInfo.ETag, ifMatchETagHeader) {
|
||||||
|
// If the object ETag does not match with the specified ETag.
|
||||||
|
writeHeaders()
|
||||||
|
writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrPreconditionFailed), r.URL)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If-None-Match : Return the object only if its entity tag (ETag) is different from the
|
||||||
|
// one specified otherwise, return a 304 (not modified).
|
||||||
|
ifNoneMatchETagHeader := r.Header.Get(xhttp.IfNoneMatch)
|
||||||
|
if ifNoneMatchETagHeader != "" {
|
||||||
|
if isETagEqual(objInfo.ETag, ifNoneMatchETagHeader) {
|
||||||
|
// If the object ETag matches with the specified ETag.
|
||||||
|
writeHeaders()
|
||||||
|
w.WriteHeader(http.StatusNotModified)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
etagMatch := opts.PreserveETag != "" && isETagEqual(objInfo.ETag, opts.PreserveETag)
|
etagMatch := opts.PreserveETag != "" && isETagEqual(objInfo.ETag, opts.PreserveETag)
|
||||||
vidMatch := opts.VersionID != "" && opts.VersionID == objInfo.VersionID
|
vidMatch := opts.VersionID != "" && opts.VersionID == objInfo.VersionID
|
||||||
mtimeMatch := !opts.MTime.IsZero() && objInfo.ModTime.Unix() >= opts.MTime.Unix()
|
mtimeMatch := !opts.MTime.IsZero() && objInfo.ModTime.Unix() >= opts.MTime.Unix()
|
||||||
|
@ -1769,7 +1769,9 @@ func (api objectAPIHandlers) PutObjectHandler(w http.ResponseWriter, r *http.Req
|
|||||||
}
|
}
|
||||||
opts.IndexCB = idxCb
|
opts.IndexCB = idxCb
|
||||||
|
|
||||||
if !opts.MTime.IsZero() && opts.PreserveETag != "" {
|
if (!opts.MTime.IsZero() && opts.PreserveETag != "") ||
|
||||||
|
r.Header.Get(xhttp.IfMatch) != "" ||
|
||||||
|
r.Header.Get(xhttp.IfNoneMatch) != "" {
|
||||||
opts.CheckPrecondFn = func(oi ObjectInfo) bool {
|
opts.CheckPrecondFn = func(oi ObjectInfo) bool {
|
||||||
if _, err := DecryptObjectInfo(&oi, r); err != nil {
|
if _, err := DecryptObjectInfo(&oi, r); err != nil {
|
||||||
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL)
|
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user