Browse Source

jsonrpc error reason

pull/313/head
xyctruth 4 years ago
parent
commit
97be1a189c
  1. 19
      dtmcli/dtmimp/utils.go
  2. 103
      dtmsvr/trans_status.go

19
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() {

103
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, &params)
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, &params)
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 {

Loading…
Cancel
Save