From 97be1a189ca5c896e496b10e28daf1e38ff5a3a3 Mon Sep 17 00:00:00 2001 From: xyctruth <398041993@qq.com> Date: Thu, 23 Jun 2022 18:02:07 +0800 Subject: [PATCH 1/3] jsonrpc error reason --- dtmcli/dtmimp/utils.go | 19 ++++++++ dtmsvr/trans_status.go | 103 +++++++++++++++++++++-------------------- 2 files changed, 71 insertions(+), 51 deletions(-) diff --git a/dtmcli/dtmimp/utils.go b/dtmcli/dtmimp/utils.go index 1e5607a..71b2860 100644 --- a/dtmcli/dtmimp/utils.go +++ b/dtmcli/dtmimp/utils.go @@ -20,6 +20,8 @@ import ( "sync" "time" + "github.com/dtm-labs/dtm/dtmcli" + "github.com/dtm-labs/dtm/dtmcli/logger" "github.com/go-resty/resty/v2" ) @@ -233,6 +235,23 @@ func RespAsErrorCompatible(resp *resty.Response) error { return nil } +// JsonRpcRespAsError translate json rpc resty response to error +func JsonRpcRespAsError(resp *resty.Response) error { + str := resp.String() + var result map[string]interface{} + MustUnmarshalString(str, &result) + if result["error"] != nil { + rerr := result["error"].(map[string]interface{}) + if rerr["code"] == JrpcCodeFailure { + return fmt.Errorf("%s. %w", str, ErrFailure) + } else if rerr["code"] == JrpcCodeOngoing { + return dtmcli.ErrOngoing + } + return errors.New(resp.String()) + } + return nil +} + // DeferDo a common defer do used in dtmcli/dtmgrpc func DeferDo(rerr *error, success func() error, fail func() error) { defer func() { diff --git a/dtmsvr/trans_status.go b/dtmsvr/trans_status.go index fa1e51e..80350e7 100644 --- a/dtmsvr/trans_status.go +++ b/dtmsvr/trans_status.go @@ -113,59 +113,60 @@ func (t *TransGlobal) getURLResult(uri string, branchID, op string, branchPayloa dtmimp.RestyClient.SetTimeout(time.Duration(t.RequestTimeout) * time.Second) } if t.Protocol == "json-rpc" && strings.Contains(uri, "method") { - var params map[string]interface{} - dtmimp.MustUnmarshal(branchPayload, ¶ms) - u, err := url.Parse(uri) - dtmimp.E2P(err) - params["gid"] = t.Gid - params["trans_type"] = t.TransType - params["branch_id"] = branchID - params["op"] = op - resp, err := dtmimp.RestyClient.R().SetBody(map[string]interface{}{ - "params": params, - "jsonrpc": "2.0", - "method": u.Query().Get("method"), - "id": shortuuid.New(), - }). - SetHeader("Content-type", "application/json"). - SetHeaders(t.Ext.Headers). - SetHeaders(t.TransOptions.BranchHeaders). - Post(uri) - if err == nil { - err = dtmimp.RespAsErrorCompatible(resp) - } - var result map[string]interface{} - if err == nil { - dtmimp.MustUnmarshalString(resp.String(), &result) - if result["error"] != nil { - rerr := result["error"].(map[string]interface{}) - if rerr["code"] == dtmimp.JrpcCodeFailure { - return dtmcli.ErrFailure - } else if rerr["code"] == dtmimp.JrpcCodeOngoing { - return dtmcli.ErrOngoing - } - return errors.New(resp.String()) - } - } - return err + return t.getJsonRpcResult(uri, branchID, op, branchPayload) } - resp, err := dtmimp.RestyClient.R().SetBody(string(branchPayload)). - SetQueryParams(map[string]string{ - "gid": t.Gid, - "trans_type": t.TransType, - "branch_id": branchID, - "op": op, - }). - SetHeader("Content-type", "application/json"). - SetHeaders(t.Ext.Headers). - SetHeaders(t.TransOptions.BranchHeaders). - Execute(dtmimp.If(branchPayload != nil || t.TransType == "xa", "POST", "GET").(string), uri) - if err != nil { - return err - } - return dtmimp.RespAsErrorCompatible(resp) + return t.getHttpResult(uri, branchID, op, branchPayload) + } + return t.getGrpcResult(uri, branchID, op, branchPayload) +} + +func (t *TransGlobal) getHttpResult(uri string, branchID, op string, branchPayload []byte) error { + resp, err := dtmimp.RestyClient.R().SetBody(string(branchPayload)). + SetQueryParams(map[string]string{ + "gid": t.Gid, + "trans_type": t.TransType, + "branch_id": branchID, + "op": op, + }). + SetHeader("Content-type", "application/json"). + SetHeaders(t.Ext.Headers). + SetHeaders(t.TransOptions.BranchHeaders). + Execute(dtmimp.If(branchPayload != nil || t.TransType == "xa", "POST", "GET").(string), uri) + if err != nil { + return err } - dtmimp.PanicIf(t.Protocol == dtmimp.ProtocolHTTP, fmt.Errorf("bad url for http: %s", uri)) + return dtmimp.RespAsErrorCompatible(resp) +} + +func (t *TransGlobal) getJsonRpcResult(uri string, branchID, op string, branchPayload []byte) error { + var params map[string]interface{} + dtmimp.MustUnmarshal(branchPayload, ¶ms) + u, err := url.Parse(uri) + dtmimp.E2P(err) + params["gid"] = t.Gid + params["trans_type"] = t.TransType + params["branch_id"] = branchID + params["op"] = op + resp, err := dtmimp.RestyClient.R().SetBody(map[string]interface{}{ + "params": params, + "jsonrpc": "2.0", + "method": u.Query().Get("method"), + "id": shortuuid.New(), + }). + SetHeader("Content-type", "application/json"). + SetHeaders(t.Ext.Headers). + SetHeaders(t.TransOptions.BranchHeaders). + Post(uri) + if err == nil { + err = dtmimp.RespAsErrorCompatible(resp) + } + if err == nil { + err = dtmimp.JsonRpcRespAsError(resp) + } + return err +} + +func (t *TransGlobal) getGrpcResult(uri string, branchID, op string, branchPayload []byte) error { // grpc handler server, method, err := dtmdriver.GetDriver().ParseServerMethod(uri) if err != nil { From ee4571a93e7cc0344e947b0b293df2cea8748773 Mon Sep 17 00:00:00 2001 From: xyctruth <398041993@qq.com> Date: Thu, 23 Jun 2022 18:11:00 +0800 Subject: [PATCH 2/3] fix package reference --- dtmcli/dtmimp/utils.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/dtmcli/dtmimp/utils.go b/dtmcli/dtmimp/utils.go index 71b2860..363c98c 100644 --- a/dtmcli/dtmimp/utils.go +++ b/dtmcli/dtmimp/utils.go @@ -20,8 +20,6 @@ import ( "sync" "time" - "github.com/dtm-labs/dtm/dtmcli" - "github.com/dtm-labs/dtm/dtmcli/logger" "github.com/go-resty/resty/v2" ) @@ -245,7 +243,7 @@ func JsonRpcRespAsError(resp *resty.Response) error { if rerr["code"] == JrpcCodeFailure { return fmt.Errorf("%s. %w", str, ErrFailure) } else if rerr["code"] == JrpcCodeOngoing { - return dtmcli.ErrOngoing + return ErrOngoing } return errors.New(resp.String()) } From d30daa959c4427fd35bb363f0e691d9bbd27d822 Mon Sep 17 00:00:00 2001 From: xyctruth <398041993@qq.com> Date: Thu, 23 Jun 2022 18:19:42 +0800 Subject: [PATCH 3/3] fix go lint --- dtmcli/dtmimp/utils.go | 4 ++-- dtmsvr/trans_status.go | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dtmcli/dtmimp/utils.go b/dtmcli/dtmimp/utils.go index 363c98c..93dd1fb 100644 --- a/dtmcli/dtmimp/utils.go +++ b/dtmcli/dtmimp/utils.go @@ -233,8 +233,8 @@ func RespAsErrorCompatible(resp *resty.Response) error { return nil } -// JsonRpcRespAsError translate json rpc resty response to error -func JsonRpcRespAsError(resp *resty.Response) error { +// RespAsErrorByJSONRPC translate json rpc resty response to error +func RespAsErrorByJSONRPC(resp *resty.Response) error { str := resp.String() var result map[string]interface{} MustUnmarshalString(str, &result) diff --git a/dtmsvr/trans_status.go b/dtmsvr/trans_status.go index 80350e7..eb47f7e 100644 --- a/dtmsvr/trans_status.go +++ b/dtmsvr/trans_status.go @@ -113,14 +113,14 @@ func (t *TransGlobal) getURLResult(uri string, branchID, op string, branchPayloa dtmimp.RestyClient.SetTimeout(time.Duration(t.RequestTimeout) * time.Second) } if t.Protocol == "json-rpc" && strings.Contains(uri, "method") { - return t.getJsonRpcResult(uri, branchID, op, branchPayload) + return t.getJSONRPCResult(uri, branchID, op, branchPayload) } - return t.getHttpResult(uri, branchID, op, branchPayload) + return t.getHTTPResult(uri, branchID, op, branchPayload) } return t.getGrpcResult(uri, branchID, op, branchPayload) } -func (t *TransGlobal) getHttpResult(uri string, branchID, op string, branchPayload []byte) error { +func (t *TransGlobal) getHTTPResult(uri string, branchID, op string, branchPayload []byte) error { resp, err := dtmimp.RestyClient.R().SetBody(string(branchPayload)). SetQueryParams(map[string]string{ "gid": t.Gid, @@ -138,7 +138,7 @@ func (t *TransGlobal) getHttpResult(uri string, branchID, op string, branchPaylo return dtmimp.RespAsErrorCompatible(resp) } -func (t *TransGlobal) getJsonRpcResult(uri string, branchID, op string, branchPayload []byte) error { +func (t *TransGlobal) getJSONRPCResult(uri string, branchID, op string, branchPayload []byte) error { var params map[string]interface{} dtmimp.MustUnmarshal(branchPayload, ¶ms) u, err := url.Parse(uri) @@ -161,7 +161,7 @@ func (t *TransGlobal) getJsonRpcResult(uri string, branchID, op string, branchPa err = dtmimp.RespAsErrorCompatible(resp) } if err == nil { - err = dtmimp.JsonRpcRespAsError(resp) + err = dtmimp.RespAsErrorByJSONRPC(resp) } return err }