|
|
|
@ -827,7 +827,7 @@ func (api objectAPIHandlers) CopyObjectHandler(w http.ResponseWriter, r *http.Re |
|
|
|
|
reader = gr |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
srcInfo.Reader, err = hash.NewReader(reader, length, "", "", actualSize) |
|
|
|
|
srcInfo.Reader, err = hash.NewReader(reader, length, "", "", actualSize, globalCLIContext.StrictS3Compat) |
|
|
|
|
if err != nil { |
|
|
|
|
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) |
|
|
|
|
return |
|
|
|
@ -934,7 +934,8 @@ func (api objectAPIHandlers) CopyObjectHandler(w http.ResponseWriter, r *http.Re |
|
|
|
|
crypto.RemoveInternalEntries(srcInfo.UserDefined) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
srcInfo.Reader, err = hash.NewReader(reader, targetSize, "", "", targetSize) // do not try to verify encrypted content
|
|
|
|
|
// do not try to verify encrypted content
|
|
|
|
|
srcInfo.Reader, err = hash.NewReader(reader, targetSize, "", "", targetSize, globalCLIContext.StrictS3Compat) |
|
|
|
|
if err != nil { |
|
|
|
|
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) |
|
|
|
|
return |
|
|
|
@ -1188,7 +1189,7 @@ func (api objectAPIHandlers) PutObjectHandler(w http.ResponseWriter, r *http.Req |
|
|
|
|
metadata[ReservedMetadataPrefix+"compression"] = compressionAlgorithmV1 |
|
|
|
|
metadata[ReservedMetadataPrefix+"actual-size"] = strconv.FormatInt(size, 10) |
|
|
|
|
|
|
|
|
|
actualReader, err := hash.NewReader(reader, size, md5hex, sha256hex, actualSize) |
|
|
|
|
actualReader, err := hash.NewReader(reader, size, md5hex, sha256hex, actualSize, globalCLIContext.StrictS3Compat) |
|
|
|
|
if err != nil { |
|
|
|
|
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) |
|
|
|
|
return |
|
|
|
@ -1201,7 +1202,7 @@ func (api objectAPIHandlers) PutObjectHandler(w http.ResponseWriter, r *http.Req |
|
|
|
|
sha256hex = "" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
hashReader, err := hash.NewReader(reader, size, md5hex, sha256hex, actualSize) |
|
|
|
|
hashReader, err := hash.NewReader(reader, size, md5hex, sha256hex, actualSize, globalCLIContext.StrictS3Compat) |
|
|
|
|
if err != nil { |
|
|
|
|
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) |
|
|
|
|
return |
|
|
|
@ -1235,7 +1236,8 @@ func (api objectAPIHandlers) PutObjectHandler(w http.ResponseWriter, r *http.Req |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
info := ObjectInfo{Size: size} |
|
|
|
|
hashReader, err = hash.NewReader(reader, info.EncryptedSize(), "", "", size) // do not try to verify encrypted content
|
|
|
|
|
// do not try to verify encrypted content
|
|
|
|
|
hashReader, err = hash.NewReader(reader, info.EncryptedSize(), "", "", size, globalCLIContext.StrictS3Compat) |
|
|
|
|
if err != nil { |
|
|
|
|
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) |
|
|
|
|
return |
|
|
|
@ -1260,8 +1262,9 @@ func (api objectAPIHandlers) PutObjectHandler(w http.ResponseWriter, r *http.Req |
|
|
|
|
|
|
|
|
|
etag := objInfo.ETag |
|
|
|
|
if objInfo.IsCompressed() { |
|
|
|
|
// Ignore compressed ETag.
|
|
|
|
|
etag = objInfo.ETag + "-1" |
|
|
|
|
if !strings.HasSuffix(objInfo.ETag, "-1") { |
|
|
|
|
etag = objInfo.ETag + "-1" |
|
|
|
|
} |
|
|
|
|
} else if hasServerSideEncryptionHeader(r.Header) { |
|
|
|
|
etag = getDecryptedETag(r.Header, objInfo, false) |
|
|
|
|
} |
|
|
|
@ -1613,7 +1616,7 @@ func (api objectAPIHandlers) CopyObjectPartHandler(w http.ResponseWriter, r *htt |
|
|
|
|
reader = gr |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
srcInfo.Reader, err = hash.NewReader(reader, length, "", "", actualPartSize) |
|
|
|
|
srcInfo.Reader, err = hash.NewReader(reader, length, "", "", actualPartSize, globalCLIContext.StrictS3Compat) |
|
|
|
|
if err != nil { |
|
|
|
|
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) |
|
|
|
|
return |
|
|
|
@ -1673,7 +1676,7 @@ func (api objectAPIHandlers) CopyObjectPartHandler(w http.ResponseWriter, r *htt |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
info := ObjectInfo{Size: length} |
|
|
|
|
srcInfo.Reader, err = hash.NewReader(reader, info.EncryptedSize(), "", "", length) |
|
|
|
|
srcInfo.Reader, err = hash.NewReader(reader, info.EncryptedSize(), "", "", length, globalCLIContext.StrictS3Compat) |
|
|
|
|
if err != nil { |
|
|
|
|
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) |
|
|
|
|
return |
|
|
|
@ -1840,7 +1843,7 @@ func (api objectAPIHandlers) PutObjectPartHandler(w http.ResponseWriter, r *http |
|
|
|
|
|
|
|
|
|
isCompressed := false |
|
|
|
|
if objectAPI.IsCompressionSupported() && compressPart { |
|
|
|
|
actualReader, err := hash.NewReader(reader, size, md5hex, sha256hex, actualSize) |
|
|
|
|
actualReader, err := hash.NewReader(reader, size, md5hex, sha256hex, actualSize, globalCLIContext.StrictS3Compat) |
|
|
|
|
if err != nil { |
|
|
|
|
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) |
|
|
|
|
return |
|
|
|
@ -1854,7 +1857,7 @@ func (api objectAPIHandlers) PutObjectPartHandler(w http.ResponseWriter, r *http |
|
|
|
|
isCompressed = true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
hashReader, err := hash.NewReader(reader, size, md5hex, sha256hex, actualSize) |
|
|
|
|
hashReader, err := hash.NewReader(reader, size, md5hex, sha256hex, actualSize, globalCLIContext.StrictS3Compat) |
|
|
|
|
if err != nil { |
|
|
|
|
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) |
|
|
|
|
return |
|
|
|
@ -1921,7 +1924,8 @@ func (api objectAPIHandlers) PutObjectPartHandler(w http.ResponseWriter, r *http |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
info := ObjectInfo{Size: size} |
|
|
|
|
hashReader, err = hash.NewReader(reader, info.EncryptedSize(), "", "", size) // do not try to verify encrypted content
|
|
|
|
|
// do not try to verify encrypted content
|
|
|
|
|
hashReader, err = hash.NewReader(reader, info.EncryptedSize(), "", "", size, globalCLIContext.StrictS3Compat) |
|
|
|
|
if err != nil { |
|
|
|
|
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL, guessIsBrowserReq(r)) |
|
|
|
|
return |
|
|
|
@ -1942,10 +1946,7 @@ func (api objectAPIHandlers) PutObjectPartHandler(w http.ResponseWriter, r *http |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
etag := partInfo.ETag |
|
|
|
|
if isCompressed { |
|
|
|
|
// Suppress compressed ETag.
|
|
|
|
|
etag = partInfo.ETag + "-1" |
|
|
|
|
} else if isEncrypted { |
|
|
|
|
if isEncrypted { |
|
|
|
|
etag = tryDecryptETag(objectEncryptionKey, partInfo.ETag, crypto.SSEC.IsRequested(r.Header)) |
|
|
|
|
} |
|
|
|
|
w.Header()["ETag"] = []string{"\"" + etag + "\""} |
|
|
|
@ -2235,11 +2236,6 @@ func (api objectAPIHandlers) CompleteMultipartUploadHandler(w http.ResponseWrite |
|
|
|
|
// Complete parts.
|
|
|
|
|
var completeParts []CompletePart |
|
|
|
|
for _, part := range complMultipartUpload.Parts { |
|
|
|
|
// Avoiding for gateway parts.
|
|
|
|
|
// `strings.TrimPrefix` does not work here as intended. So `Replace` is used instead.
|
|
|
|
|
if objectAPI.IsCompressionSupported() { |
|
|
|
|
part.ETag = strings.Replace(part.ETag, "-1", "", -1) // For compressed multiparts, We append '-1' for part.ETag.
|
|
|
|
|
} |
|
|
|
|
part.ETag = canonicalizeETag(part.ETag) |
|
|
|
|
if isEncrypted { |
|
|
|
|
// ETag is stored in the backend in encrypted form. Validate client sent ETag with
|
|
|
|
|