rpc: decode args without wire

This commit is contained in:
Ethan Buchman
2017-04-28 14:36:38 -04:00
parent 6c60c07f16
commit acfbea6d49
2 changed files with 88 additions and 7 deletions

View File

@ -2,6 +2,7 @@ package rpcserver
import (
"bytes"
"encoding/base64"
"encoding/hex"
"encoding/json"
"fmt"
@ -14,7 +15,8 @@ import (
"github.com/gorilla/websocket"
"github.com/pkg/errors"
wire "github.com/tendermint/go-wire"
//wire "github.com/tendermint/go-wire"
"github.com/tendermint/go-wire/data"
types "github.com/tendermint/tendermint/rpc/lib/types"
cmn "github.com/tendermint/tmlibs/common"
events "github.com/tendermint/tmlibs/events"
@ -204,7 +206,32 @@ func jsonParamsToArgsWS(rpcFunc *RPCFunc, paramsI interface{}, wsCtx types.WSRPC
func _jsonObjectToArg(ty reflect.Type, object interface{}) (reflect.Value, error) {
var err error
v := reflect.New(ty)
wire.ReadJSONObjectPtr(v.Interface(), object, &err)
// if the object is a byte array, we need to decode it
if ty.Kind() == reflect.Slice && ty.Elem().Kind() == reflect.Uint8 {
s, ok := object.(string)
if !ok {
return v, fmt.Errorf("cmah")
}
// if its data.Bytes, use hex
// else use base64
dbty := reflect.TypeOf(data.Bytes{})
if ty == dbty {
decoded, err := hex.DecodeString(s)
if err != nil {
return v, err
}
object = decoded
} else {
decoded, err := base64.StdEncoding.DecodeString(s)
if err != nil {
return v, err
}
object = decoded
}
}
v.Elem().Set(reflect.ValueOf(object))
if err != nil {
return v, err
}