[#79] Fix panic on get empty object

Signed-off-by: Denis Kirillov <denis@nspcc.ru>
This commit is contained in:
Denis Kirillov 2022-10-18 12:49:06 +03:00 committed by Alex Vanin
parent e79189045e
commit 8d83320120
3 changed files with 136 additions and 17 deletions

View file

@ -142,28 +142,26 @@ func (a *API) GetObjectInfo(params operations.GetObjectInfoParams, principal *mo
}
}
var prmRange pool.PrmObjectRange
prmRange.SetAddress(addr)
prmRange.UseBearer(btoken)
var offset, length uint64
if params.RangeOffset != nil || params.RangeLength != nil {
if params.RangeOffset == nil || params.RangeLength == nil {
errResp := a.logAndGetErrorResponse("invalid range param", errors.New("both offset and length musded"))
return errorResponse.WithPayload(errResp)
}
offset = uint64(*params.RangeOffset)
length = uint64(*params.RangeLength)
} else {
length = objInfo.PayloadSize()
if objInfo.PayloadSize() == 0 {
return operations.NewGetObjectInfoOK().WithPayload(&resp)
}
offset, length, err := prepareOffsetLength(params, objInfo.PayloadSize())
if err != nil {
errResp := a.logAndGetErrorResponse("invalid range param", err)
return errorResponse.WithPayload(errResp)
}
prmRange.SetOffset(offset)
prmRange.SetLength(length)
if uint64(*params.MaxPayloadSize) < length {
return operations.NewGetObjectInfoOK().WithPayload(&resp)
}
var prmRange pool.PrmObjectRange
prmRange.SetAddress(addr)
prmRange.UseBearer(btoken)
prmRange.SetOffset(offset)
prmRange.SetLength(length)
rangeRes, err := a.pool.ObjectRange(ctx, prmRange)
if err != nil {
errResp := a.logAndGetErrorResponse("range object", err)
@ -436,3 +434,26 @@ func prepareBearerToken(bt *BearerToken, isWalletConnect, isFullToken bool) (bea
return btoken, nil
}
func prepareOffsetLength(params operations.GetObjectInfoParams, objSize uint64) (uint64, uint64, error) {
var offset, length uint64
if params.RangeOffset != nil || params.RangeLength != nil {
if params.RangeOffset == nil || params.RangeLength == nil {
return 0, 0, errors.New("both offset and length must be provided")
}
offset = uint64(*params.RangeOffset)
length = uint64(*params.RangeLength)
} else {
length = objSize
}
if offset >= objSize {
return 0, 0, fmt.Errorf("offset '%d' must be less than object size '%d'", offset, objSize)
}
if offset+length > objSize {
return 0, 0, fmt.Errorf("end of range '%d' must be less or equal object size '%d'", offset+length, objSize)
}
return offset, length, nil
}