Compare commits

...

1 commit

Author SHA1 Message Date
Harshavardhana 58855f173c fix: calculate correct content-range with partNumber query
fixes #11989
fixes #11824
2021-04-20 20:02:22 -07:00
3 changed files with 12 additions and 6 deletions

View file

@ -80,6 +80,7 @@ const (
ErrInvalidBucketName ErrInvalidBucketName
ErrInvalidDigest ErrInvalidDigest
ErrInvalidRange ErrInvalidRange
ErrInvalidRangePartNumber
ErrInvalidCopyPartRange ErrInvalidCopyPartRange
ErrInvalidCopyPartRangeSource ErrInvalidCopyPartRangeSource
ErrInvalidMaxKeys ErrInvalidMaxKeys
@ -503,6 +504,11 @@ var errorCodes = errorCodeMap{
Description: "The requested range is not satisfiable", Description: "The requested range is not satisfiable",
HTTPStatusCode: http.StatusRequestedRangeNotSatisfiable, HTTPStatusCode: http.StatusRequestedRangeNotSatisfiable,
}, },
ErrInvalidRangePartNumber: {
Code: "InvalidRequest",
Description: "Cannot specify both Range header and partNumber query parameter",
HTTPStatusCode: http.StatusBadRequest,
},
ErrMalformedXML: { ErrMalformedXML: {
Code: "MalformedXML", Code: "MalformedXML",
Description: "The XML you provided was not well-formed or did not validate against our published schema.", Description: "The XML you provided was not well-formed or did not validate against our published schema.",

View file

@ -156,16 +156,16 @@ func setObjectHeaders(w http.ResponseWriter, objInfo ObjectInfo, rs *HTTPRangeSp
return err return err
} }
if rs == nil && opts.PartNumber > 0 {
rs = partNumberToRangeSpec(objInfo, opts.PartNumber)
}
// For providing ranged content // For providing ranged content
start, rangeLen, err = rs.GetOffsetLength(totalObjectSize) start, rangeLen, err = rs.GetOffsetLength(totalObjectSize)
if err != nil { if err != nil {
return err return err
} }
if rs == nil && opts.PartNumber > 0 {
rs = partNumberToRangeSpec(objInfo, opts.PartNumber)
}
// Set content length. // Set content length.
w.Header().Set(xhttp.ContentLength, strconv.FormatInt(rangeLen, 10)) w.Header().Set(xhttp.ContentLength, strconv.FormatInt(rangeLen, 10))
if rs != nil { if rs != nil {

View file

@ -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 // Both 'bytes' and 'partNumber' cannot be specified at the same time
if rs != nil && opts.PartNumber > 0 { if rs != nil && opts.PartNumber > 0 {
writeErrorResponseHeadersOnly(w, errorCodes.ToAPIErr(ErrBadRequest)) writeErrorResponse(ctx, w, errorCodes.ToAPIErr(ErrInvalidRangePartNumber), r.URL, guessIsBrowserReq(r))
return 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 // Both 'bytes' and 'partNumber' cannot be specified at the same time
if rs != nil && opts.PartNumber > 0 { if rs != nil && opts.PartNumber > 0 {
writeErrorResponseHeadersOnly(w, errorCodes.ToAPIErr(ErrBadRequest)) writeErrorResponseHeadersOnly(w, errorCodes.ToAPIErr(ErrInvalidRangePartNumber))
return return
} }