package rpcclient
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"errors"
|
|
"io/ioutil"
|
|
"net/http"
|
|
|
|
. "github.com/tendermint/go-common"
|
|
"github.com/tendermint/go-wire"
|
|
. "github.com/tendermint/tendermint/rpc/types"
|
|
)
|
|
|
|
func Call(remote string, method string, params []interface{}, dest interface{}) (interface{}, error) {
|
|
// Make request and get responseBytes
|
|
request := RPCRequest{
|
|
JSONRPC: "2.0",
|
|
Method: method,
|
|
Params: params,
|
|
ID: "",
|
|
}
|
|
requestBytes := wire.JSONBytes(request)
|
|
requestBuf := bytes.NewBuffer(requestBytes)
|
|
log.Info(Fmt("RPC request to %v: %v", remote, string(requestBytes)))
|
|
httpResponse, err := http.Post(remote, "text/json", requestBuf)
|
|
if err != nil {
|
|
return dest, err
|
|
}
|
|
defer httpResponse.Body.Close()
|
|
responseBytes, err := ioutil.ReadAll(httpResponse.Body)
|
|
if err != nil {
|
|
return dest, err
|
|
}
|
|
log.Info(Fmt("RPC response: %v", string(responseBytes)))
|
|
|
|
// Parse response into JSONResponse
|
|
response := RPCResponse{}
|
|
err = json.Unmarshal(responseBytes, &response)
|
|
if err != nil {
|
|
return dest, err
|
|
}
|
|
// Parse response into dest
|
|
resultJSONObject := response.Result
|
|
errorStr := response.Error
|
|
if errorStr != "" {
|
|
return dest, errors.New(errorStr)
|
|
}
|
|
dest = wire.ReadJSONObject(dest, resultJSONObject, &err)
|
|
return dest, err
|
|
}
|