From 58855f173c2887cd02cf267ba5d002a2f49425ca Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Tue, 6 Apr 2021 23:07:08 -0700 Subject: [PATCH] fix: calculate correct content-range with partNumber query fixes #11989 fixes #11824 --- cmd/api-errors.go | 6 ++++++ cmd/api-headers.go | 8 ++++---- cmd/object-handlers.go | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/cmd/api-errors.go b/cmd/api-errors.go index 3ebbf42e9..76a476af9 100644 --- a/cmd/api-errors.go +++ b/cmd/api-errors.go @@ -80,6 +80,7 @@ const ( ErrInvalidBucketName ErrInvalidDigest ErrInvalidRange + ErrInvalidRangePartNumber ErrInvalidCopyPartRange ErrInvalidCopyPartRangeSource ErrInvalidMaxKeys @@ -503,6 +504,11 @@ var errorCodes = errorCodeMap{ Description: "The requested range is not satisfiable", HTTPStatusCode: http.StatusRequestedRangeNotSatisfiable, }, + ErrInvalidRangePartNumber: { + Code: "InvalidRequest", + Description: "Cannot specify both Range header and partNumber query parameter", + HTTPStatusCode: http.StatusBadRequest, + }, ErrMalformedXML: { Code: "MalformedXML", Description: "The XML you provided was not well-formed or did not validate against our published schema.", diff --git a/cmd/api-headers.go b/cmd/api-headers.go index 843835a9e..41af35e9e 100644 --- a/cmd/api-headers.go +++ b/cmd/api-headers.go @@ -156,16 +156,16 @@ func setObjectHeaders(w http.ResponseWriter, objInfo ObjectInfo, rs *HTTPRangeSp return err } + if rs == nil && opts.PartNumber > 0 { + rs = partNumberToRangeSpec(objInfo, opts.PartNumber) + } + // For providing ranged content start, rangeLen, err = rs.GetOffsetLength(totalObjectSize) if err != nil { return err } - if rs == nil && opts.PartNumber > 0 { - rs = partNumberToRangeSpec(objInfo, opts.PartNumber) - } - // Set content length. w.Header().Set(xhttp.ContentLength, strconv.FormatInt(rangeLen, 10)) if rs != nil { diff --git a/cmd/object-handlers.go b/cmd/object-handlers.go index e46af885c..a009dbc80 100644 --- a/cmd/object-handlers.go +++ b/cmd/object-handlers.go @@ -395,7 +395,7 @@ func (api objectAPIHandlers) GetObjectHandler(w http.ResponseWriter, r *http.Req // Both 'bytes' and 'partNumber' cannot be specified at the same time if rs != nil && opts.PartNumber > 0 { - writeErrorResponseHeadersOnly(w, errorCodes.ToAPIErr(ErrBadRequest)) + writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrInvalidRangePartNumber), r.URL, guessIsBrowserReq(r)) return } @@ -648,7 +648,7 @@ func (api objectAPIHandlers) HeadObjectHandler(w http.ResponseWriter, r *http.Re // Both 'bytes' and 'partNumber' cannot be specified at the same time if rs != nil && opts.PartNumber > 0 { - writeErrorResponseHeadersOnly(w, errorCodes.ToAPIErr(ErrBadRequest)) + writeErrorResponseHeadersOnly(w, errorCodes.ToAPIErr(ErrInvalidRangePartNumber)) return }