From 3e3d53daef8132b5b009bee180a64130ef9e46cb Mon Sep 17 00:00:00 2001 From: Silas Davis Date: Sun, 22 Oct 2017 15:14:21 +0100 Subject: [PATCH] Make RPCError an actual error and don't swallow its companion data --- rpc/lib/client/http_client.go | 2 +- rpc/lib/client/ws_client.go | 2 +- rpc/lib/types/types.go | 9 ++++++++- rpc/lib/types/types_test.go | 17 +++++++++++++++++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/rpc/lib/client/http_client.go b/rpc/lib/client/http_client.go index 1fbaedfae..4c40117e9 100644 --- a/rpc/lib/client/http_client.go +++ b/rpc/lib/client/http_client.go @@ -147,7 +147,7 @@ func unmarshalResponseBytes(responseBytes []byte, result interface{}) (interface return nil, errors.Errorf("Error unmarshalling rpc response: %v", err) } if response.Error != nil { - return nil, errors.Errorf("Response error: %v", response.Error.Message) + return nil, errors.Errorf("Response error: %v", response.Error) } // unmarshal the RawMessage into the result err = json.Unmarshal(*response.Result, result) diff --git a/rpc/lib/client/ws_client.go b/rpc/lib/client/ws_client.go index 2bdfa5c9a..d233004b6 100644 --- a/rpc/lib/client/ws_client.go +++ b/rpc/lib/client/ws_client.go @@ -437,7 +437,7 @@ func (c *WSClient) readRoutine() { continue } if response.Error != nil { - c.ErrorsCh <- errors.New(response.Error.Message) + c.ErrorsCh <- response.Error continue } c.Logger.Info("got response", "resp", response.Result) diff --git a/rpc/lib/types/types.go b/rpc/lib/types/types.go index 07a8e5683..86f9264dd 100644 --- a/rpc/lib/types/types.go +++ b/rpc/lib/types/types.go @@ -6,7 +6,6 @@ import ( "strings" "github.com/pkg/errors" - events "github.com/tendermint/tmlibs/events" ) @@ -60,6 +59,14 @@ type RPCError struct { Data string `json:"data,omitempty"` } +func (err RPCError) Error() string { + const baseFormat = "RPC error %v - %s" + if err.Data != "" { + return fmt.Sprintf(baseFormat+": %s", err.Code, err.Message, err.Data) + } + return fmt.Sprintf(baseFormat, err.Code, err.Message) +} + type RPCResponse struct { JSONRPC string `json:"jsonrpc"` ID string `json:"id"` diff --git a/rpc/lib/types/types_test.go b/rpc/lib/types/types_test.go index bab42124a..60f7b2213 100644 --- a/rpc/lib/types/types_test.go +++ b/rpc/lib/types/types_test.go @@ -4,6 +4,8 @@ import ( "encoding/json" "testing" + "fmt" + "github.com/pkg/errors" "github.com/stretchr/testify/assert" ) @@ -30,3 +32,18 @@ func TestResponses(t *testing.T) { i := `{"jsonrpc":"2.0","id":"2","error":{"code":-32601,"message":"Method not found"}}` assert.Equal(string(h), string(i)) } + +func TestRPCError(t *testing.T) { + assert.Equal(t, "RPC error 12 - Badness: One worse than a code 11", + fmt.Sprintf("%v", &RPCError{ + Code: 12, + Message: "Badness", + Data: "One worse than a code 11", + })) + + assert.Equal(t, "RPC error 12 - Badness", + fmt.Sprintf("%v", &RPCError{ + Code: 12, + Message: "Badness", + })) +}