s3: Add x-minio-error-code header for S3 HEAD requests (#17283)

This commit is contained in:
Anis Eleuch 2023-05-26 18:13:18 +01:00 committed by GitHub
parent d5059840ef
commit 6425fec366
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 12 deletions

View File

@ -67,6 +67,9 @@ const (
objectLockConfig = "object-lock.xml" objectLockConfig = "object-lock.xml"
bucketTaggingConfig = "tagging.xml" bucketTaggingConfig = "tagging.xml"
bucketReplicationConfig = "replication.xml" bucketReplicationConfig = "replication.xml"
xMinIOErrCodeHeader = "x-minio-error-code"
xMinIOErrDescHeader = "x-minio-error-desc"
) )
// Check if there are buckets on server without corresponding entry in etcd backend and // Check if there are buckets on server without corresponding entry in etcd backend and
@ -1504,7 +1507,10 @@ func (api objectAPIHandlers) HeadBucketHandler(w http.ResponseWriter, r *http.Re
} }
if s3Error := checkRequestAuthType(ctx, r, policy.ListBucketAction, bucket, ""); s3Error != ErrNone { if s3Error := checkRequestAuthType(ctx, r, policy.ListBucketAction, bucket, ""); s3Error != ErrNone {
writeErrorResponseHeadersOnly(w, errorCodes.ToAPIErr(s3Error)) errCode := errorCodes.ToAPIErr(s3Error)
w.Header().Set(xMinIOErrCodeHeader, errCode.Code)
w.Header().Set(xMinIOErrDescHeader, "\""+errCode.Description+"\"")
writeErrorResponseHeadersOnly(w, errCode)
return return
} }

View File

@ -657,7 +657,10 @@ func (api objectAPIHandlers) headObjectHandler(ctx context.Context, objectAPI Ob
} }
} }
} }
writeErrorResponseHeadersOnly(w, errorCodes.ToAPIErr(s3Error)) errCode := errorCodes.ToAPIErr(s3Error)
w.Header().Set(xMinIOErrCodeHeader, errCode.Code)
w.Header().Set(xMinIOErrDescHeader, "\""+errCode.Description+"\"")
writeErrorResponseHeadersOnly(w, errCode)
return return
} }
@ -680,7 +683,7 @@ func (api objectAPIHandlers) headObjectHandler(ctx context.Context, objectAPI Ob
objInfo = oi objInfo = oi
} }
if proxy.Err != nil { if proxy.Err != nil {
writeErrorResponse(ctx, w, toAPIError(ctx, proxy.Err), r.URL) writeErrorResponseHeadersOnly(w, toAPIError(ctx, proxy.Err))
return return
} }
} }
@ -692,7 +695,10 @@ func (api objectAPIHandlers) headObjectHandler(ctx context.Context, objectAPI Ob
} }
if s3Error := authorizeRequest(ctx, r, policy.GetObjectAction); s3Error != ErrNone { if s3Error := authorizeRequest(ctx, r, policy.GetObjectAction); s3Error != ErrNone {
writeErrorResponse(ctx, w, errorCodes.ToAPIErr(s3Error), r.URL) errCode := errorCodes.ToAPIErr(s3Error)
w.Header().Set(xMinIOErrCodeHeader, errCode.Code)
w.Header().Set(xMinIOErrDescHeader, "\""+errCode.Description+"\"")
writeErrorResponseHeadersOnly(w, errCode)
return return
} }

View File

@ -421,7 +421,10 @@ func (api objectAPIHandlers) headObjectInArchiveFileHandler(ctx context.Context,
} }
} }
} }
writeErrorResponseHeadersOnly(w, errorCodes.ToAPIErr(s3Error)) errCode := errorCodes.ToAPIErr(s3Error)
w.Header().Set(xMinIOErrCodeHeader, errCode.Code)
w.Header().Set(xMinIOErrDescHeader, "\""+errCode.Description+"\"")
writeErrorResponseHeadersOnly(w, errCode)
return return
} }
@ -432,18 +435,18 @@ func (api objectAPIHandlers) headObjectInArchiveFileHandler(ctx context.Context,
// We do not allow offsetting into extracted files. // We do not allow offsetting into extracted files.
if opts.PartNumber != 0 { if opts.PartNumber != 0 {
writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrInvalidPartNumber), r.URL) writeErrorResponseHeadersOnly(w, errorCodes.ToAPIErr(ErrInvalidPartNumber))
return return
} }
if r.Header.Get(xhttp.Range) != "" { if r.Header.Get(xhttp.Range) != "" {
writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrInvalidRange), r.URL) writeErrorResponseHeadersOnly(w, errorCodes.ToAPIErr(ErrInvalidRange))
return return
} }
zipObjInfo, err := getObjectInfo(ctx, bucket, zipPath, opts) zipObjInfo, err := getObjectInfo(ctx, bucket, zipPath, opts)
if err != nil { if err != nil {
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL) writeErrorResponseHeadersOnly(w, toAPIError(ctx, err))
return return
} }
@ -451,22 +454,22 @@ func (api objectAPIHandlers) headObjectInArchiveFileHandler(ctx context.Context,
if len(zipInfo) == 0 { if len(zipInfo) == 0 {
opts.EncryptFn, err = zipObjInfo.metadataEncryptFn(r.Header) opts.EncryptFn, err = zipObjInfo.metadataEncryptFn(r.Header)
if err != nil { if err != nil {
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL) writeErrorResponseHeadersOnly(w, toAPIError(ctx, err))
return return
} }
zipInfo, err = updateObjectMetadataWithZipInfo(ctx, objectAPI, bucket, zipPath, opts) zipInfo, err = updateObjectMetadataWithZipInfo(ctx, objectAPI, bucket, zipPath, opts)
} }
if err != nil { if err != nil {
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL) writeErrorResponseHeadersOnly(w, toAPIError(ctx, err))
return return
} }
file, err := zipindex.FindSerialized(zipInfo, object) file, err := zipindex.FindSerialized(zipInfo, object)
if err != nil { if err != nil {
if err == io.EOF { if err == io.EOF {
writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrNoSuchKey), r.URL) writeErrorResponseHeadersOnly(w, errorCodes.ToAPIErr(ErrNoSuchKey))
} else { } else {
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL) writeErrorResponseHeadersOnly(w, toAPIError(ctx, err))
} }
return return
} }