81 lines
1.9 KiB
Go
81 lines
1.9 KiB
Go
|
package client
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/nspcc-dev/neofs-api-go/v2/signature"
|
||
|
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
||
|
)
|
||
|
|
||
|
// common interface of resulting structures with API status.
|
||
|
type resCommon interface {
|
||
|
setStatus(apistatus.Status)
|
||
|
}
|
||
|
|
||
|
// structure is embedded to all resulting types in order to inherit status-related methods.
|
||
|
type statusRes struct {
|
||
|
st apistatus.Status
|
||
|
}
|
||
|
|
||
|
// setStatus implements resCommon interface method.
|
||
|
func (x *statusRes) setStatus(st apistatus.Status) {
|
||
|
x.st = st
|
||
|
}
|
||
|
|
||
|
// Status returns server's status return.
|
||
|
//
|
||
|
// Use apistatus package functionality to handle the status.
|
||
|
func (x statusRes) Status() apistatus.Status {
|
||
|
return x.st
|
||
|
}
|
||
|
|
||
|
// checks response signature and write client error if it is not correct (in this case returns true).
|
||
|
func isInvalidSignatureV2(res *processResponseV2Res, resp responseV2) bool {
|
||
|
err := signature.VerifyServiceMessage(resp)
|
||
|
|
||
|
isErr := err != nil
|
||
|
if isErr {
|
||
|
res.cliErr = fmt.Errorf("invalid response signature: %w", err)
|
||
|
}
|
||
|
|
||
|
return isErr
|
||
|
}
|
||
|
|
||
|
type processResponseV2Prm struct {
|
||
|
callOpts *callOptions
|
||
|
|
||
|
resp responseV2
|
||
|
}
|
||
|
|
||
|
type processResponseV2Res struct {
|
||
|
statusRes resCommon
|
||
|
|
||
|
cliErr error
|
||
|
}
|
||
|
|
||
|
// performs common actions of response processing and writes any problem as a result status or client error
|
||
|
// (in both cases returns true).
|
||
|
//
|
||
|
// Actions:
|
||
|
// * verify signature (internal);
|
||
|
// * call response callback (internal).
|
||
|
func (c *clientImpl) processResponseV2(res *processResponseV2Res, prm processResponseV2Prm) bool {
|
||
|
// verify response structure
|
||
|
if isInvalidSignatureV2(res, prm.resp) {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
// handle response meta info
|
||
|
if err := c.handleResponseInfoV2(prm.callOpts, prm.resp); err != nil {
|
||
|
res.cliErr = err
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
// set result status
|
||
|
st := apistatus.FromStatusV2(prm.resp.GetMetaHeader().GetStatus())
|
||
|
|
||
|
res.statusRes.setStatus(st)
|
||
|
|
||
|
return !apistatus.IsSuccessful(st)
|
||
|
}
|