fix: grpc-gateway error codes (#9015)
* update grpc query handler * try fix http response error codes * add test * add changelog Co-authored-by: Alessio Treglia <alessio@tendermint.com> Co-authored-by: Amaury <1293565+amaurym@users.noreply.github.com>
This commit is contained in:
co-authored by
Alessio Treglia
Amaury
parent
37a8c7b9d3
commit
636e6598b9
+17
-1
@@ -6,6 +6,8 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
|
||||
abci "github.com/tendermint/tendermint/abci/types"
|
||||
tmbytes "github.com/tendermint/tendermint/libs/bytes"
|
||||
@@ -13,6 +15,7 @@ import (
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/store/rootmulti"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
)
|
||||
|
||||
// GetNode returns an RPC client. If the context's client is not defined, an
|
||||
@@ -84,7 +87,7 @@ func (ctx Context) queryABCI(req abci.RequestQuery) (abci.ResponseQuery, error)
|
||||
}
|
||||
|
||||
if !result.Response.IsOK() {
|
||||
return abci.ResponseQuery{}, errors.New(result.Response.Log)
|
||||
return abci.ResponseQuery{}, sdkErrorToGRPCError(result.Response)
|
||||
}
|
||||
|
||||
// data from trusted node or subspace query doesn't need verification
|
||||
@@ -95,6 +98,19 @@ func (ctx Context) queryABCI(req abci.RequestQuery) (abci.ResponseQuery, error)
|
||||
return result.Response, nil
|
||||
}
|
||||
|
||||
func sdkErrorToGRPCError(resp abci.ResponseQuery) error {
|
||||
switch resp.Code {
|
||||
case sdkerrors.ErrInvalidRequest.ABCICode():
|
||||
return status.Error(codes.InvalidArgument, resp.Log)
|
||||
case sdkerrors.ErrUnauthorized.ABCICode():
|
||||
return status.Error(codes.Unauthenticated, resp.Log)
|
||||
case sdkerrors.ErrKeyNotFound.ABCICode():
|
||||
return status.Error(codes.NotFound, resp.Log)
|
||||
default:
|
||||
return status.Error(codes.Unknown, resp.Log)
|
||||
}
|
||||
}
|
||||
|
||||
// query performs a query to a Tendermint node with the provided store name
|
||||
// and path. It returns the result and height of the query upon success
|
||||
// or an error if the query fails.
|
||||
|
||||
Reference in New Issue
Block a user