From 7178ed341cf8ebf61bfa8928eb8dd37fe986f512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?brother-=E6=88=8E?= Date: Fri, 22 Dec 2023 13:36:56 +0800 Subject: [PATCH] [version compatibility] fix up when response.ResultCode is 200 but response.Success is false (#699) * fix up when response.ResultCode is 200 but is not success * fix up when response.ResultCode is 200 but is not success * fix up when response.ResultCode is 200 but is not success * fix up when response.ResultCode is 200 but is not success * tiny fix --- common/remote/rpc/grpc_connection.go | 5 +-- common/remote/rpc/rpc_response/const.go | 10 +++++ .../remote/rpc/rpc_response/rpc_response.go | 5 +++ .../rpc/rpc_response/rpc_response_test.go | 40 +++++++++++++++++++ common/remote/rpc/rpc_response/utils.go | 24 +++++++++++ 5 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 common/remote/rpc/rpc_response/const.go create mode 100644 common/remote/rpc/rpc_response/rpc_response_test.go create mode 100644 common/remote/rpc/rpc_response/utils.go diff --git a/common/remote/rpc/grpc_connection.go b/common/remote/rpc/grpc_connection.go index dd4934bb..3bb9bf2a 100644 --- a/common/remote/rpc/grpc_connection.go +++ b/common/remote/rpc/grpc_connection.go @@ -18,7 +18,6 @@ package rpc import ( "context" - "encoding/json" "time" "github.com/golang/protobuf/ptypes/any" @@ -65,9 +64,7 @@ func (g *GrpcConnection) request(request rpc_request.IRequest, timeoutMills int6 return nil, errors.Errorf("request:%s,unsupported response type:%s", request.GetRequestType(), responsePayload.Metadata.GetType()) } - response := responseFunc() - err = json.Unmarshal(responsePayload.GetBody().Value, response) - return response, err + return rpc_response.InnerResponseJsonUnmarshal(responsePayload.GetBody().Value, responseFunc) } func (g *GrpcConnection) close() { diff --git a/common/remote/rpc/rpc_response/const.go b/common/remote/rpc/rpc_response/const.go new file mode 100644 index 00000000..34d0ebc9 --- /dev/null +++ b/common/remote/rpc/rpc_response/const.go @@ -0,0 +1,10 @@ +package rpc_response + +type ResponseCode int + +const ( + ResponseSuccessCode ResponseCode = 200 + ResponseFailCode ResponseCode = 500 + + ResponseSuccessField = "success" +) diff --git a/common/remote/rpc/rpc_response/rpc_response.go b/common/remote/rpc/rpc_response/rpc_response.go index f41f6ca0..2e364afb 100644 --- a/common/remote/rpc/rpc_response/rpc_response.go +++ b/common/remote/rpc/rpc_response/rpc_response.go @@ -36,6 +36,7 @@ type IResponse interface { GetBody() string GetErrorCode() int IsSuccess() bool + SetSuccess(bool) GetResultCode() int GetMessage() string } @@ -60,6 +61,10 @@ func (r *Response) IsSuccess() bool { return r.Success } +func (r *Response) SetSuccess(successResult bool) { + r.Success = successResult +} + func (r *Response) GetErrorCode() int { return r.ErrorCode } diff --git a/common/remote/rpc/rpc_response/rpc_response_test.go b/common/remote/rpc/rpc_response/rpc_response_test.go new file mode 100644 index 00000000..1d4a8c40 --- /dev/null +++ b/common/remote/rpc/rpc_response/rpc_response_test.go @@ -0,0 +1,40 @@ +package rpc_response + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestRpcResponseIsSuccess(t *testing.T) { + responseBody0 := `{"resultCode":200,"errorCode":0}` + responseBody1 := `{"resultCode":200,"errorCode":0,"success":true}` + responseBody2 := `{"resultCode":200,"errorCode":0,"success":"true"}` + responseBody3 := `{"resultCode":200,"errorCode":0,"success":false}` + responseBody4 := `{"resultCode":500,"errorCode":0,"success":true}` + responseBody5 := `{"resultCode":500,"errorCode":0,"success":false}` + + responseBodyList := make([]string, 0) + responseBodyList = append(responseBodyList, responseBody0, responseBody1, responseBody2, responseBody3, responseBody4, responseBody5) + for k, v := range ClientResponseMapping { + t.Run("test "+k, func(t *testing.T) { + for index, responseBody := range responseBodyList { + response, err := InnerResponseJsonUnmarshal([]byte(responseBody), v) + switch index { + case 0, 1, 4: + assert.True(t, response.IsSuccess()) + break + case 3, 5: + assert.False(t, response.IsSuccess()) + break + case 2: + assert.Nil(t, response) + assert.NotNil(t, err) + t.Logf("handle %d failed with responseBody: %s", index, responseBody) + break + default: + panic("unknown index") + } + } + }) + } +} diff --git a/common/remote/rpc/rpc_response/utils.go b/common/remote/rpc/rpc_response/utils.go new file mode 100644 index 00000000..1f70ebb1 --- /dev/null +++ b/common/remote/rpc/rpc_response/utils.go @@ -0,0 +1,24 @@ +package rpc_response + +import "encoding/json" + +func InnerResponseJsonUnmarshal(responseBody []byte, responseFunc func() IResponse) (IResponse, error) { + response := responseFunc() + err := json.Unmarshal(responseBody, response) + if err != nil { + return nil, err + } + + if !response.IsSuccess() { + tempFiledMap := make(map[string]interface{}) + err = json.Unmarshal(responseBody, &tempFiledMap) + if err != nil { + return response, nil + } + if _, ok := tempFiledMap[ResponseSuccessField]; !ok { + response.SetSuccess(response.GetResultCode() == int(ResponseSuccessCode)) + } + } + return response, err + +}