aboutsummaryrefslogtreecommitdiffstats
path: root/rpc/json.go
diff options
context:
space:
mode:
authorTaylor Gerring <taylor.gerring@gmail.com>2015-01-13 13:25:29 +0800
committerTaylor Gerring <taylor.gerring@gmail.com>2015-01-13 13:25:29 +0800
commit32bed50ba107ff69ff489e4df6f935fd404a5caa (patch)
tree282d230fca9f73660ccaeafc9db0f0185c33efa0 /rpc/json.go
parentc9985bf563888d5f346408d2ff174167e8b65880 (diff)
downloadgo-tangerine-32bed50ba107ff69ff489e4df6f935fd404a5caa.tar.gz
go-tangerine-32bed50ba107ff69ff489e4df6f935fd404a5caa.tar.zst
go-tangerine-32bed50ba107ff69ff489e4df6f935fd404a5caa.zip
begin conversion to rpc over http
Per specification at https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC
Diffstat (limited to 'rpc/json.go')
-rw-r--r--rpc/json.go67
1 files changed, 67 insertions, 0 deletions
diff --git a/rpc/json.go b/rpc/json.go
index e467f9a34..85b198d12 100644
--- a/rpc/json.go
+++ b/rpc/json.go
@@ -3,6 +3,7 @@ package rpc
import (
"encoding/json"
"io"
+ "net/http"
)
type jsonWrapper struct{}
@@ -11,10 +12,76 @@ func (self jsonWrapper) Send(writer io.Writer, v interface{}) (n int, err error)
var payload []byte
payload, err = json.Marshal(v)
if err != nil {
+ jsonlogger.Fatalln("Error marshalling JSON", err)
return 0, err
}
+ jsonlogger.Infof("Sending payload: %s", payload)
return writer.Write(payload)
}
+func (self jsonWrapper) ParseRequestBody(req *http.Request) (RpcRequest, error) {
+ var reqParsed RpcRequest
+
+ // Convert JSON to native types
+ d := json.NewDecoder(req.Body)
+ // d.UseNumber()
+ defer req.Body.Close()
+ err := d.Decode(&reqParsed)
+
+ if err != nil {
+ jsonlogger.Errorln("Error decoding JSON: ", err)
+ return reqParsed, err
+ }
+ jsonlogger.DebugDetailf("Parsed request: %s", reqParsed)
+
+ return reqParsed, nil
+}
+
+func (self jsonWrapper) GetRequestReply(xeth *EthereumApi, req *RpcRequest, reply *interface{}) error {
+ // call function for request method
+ jsonlogger.DebugDetailf("%T %s", req.Params, req.Params)
+ switch req.Method {
+ case "eth_coinbase":
+ return xeth.GetCoinbase(reply)
+ case "eth_listening":
+ return xeth.GetIsListening(reply)
+ case "eth_mining":
+ return xeth.GetIsMining(reply)
+ case "eth_peerCount":
+ return xeth.GetPeerCount(reply)
+ case "eth_countAt":
+ args, err := req.ToGetTxCountArgs()
+ if err != nil {
+ return err
+ }
+ return xeth.GetTxCountAt(args, reply)
+ // case "eth_codeAt":
+ // return nil
+ case "eth_balanceAt":
+ args, err := req.ToGetBalanceArgs()
+ if err != nil {
+ return err
+ }
+ return xeth.GetBalanceAt(args, reply)
+ case "eth_stateAt":
+ args, err := req.ToGetStorageArgs()
+ if err != nil {
+ return err
+ }
+ return xeth.GetStorageAt(args, reply)
+ case "eth_blockByNumber", "eth_blockByHash":
+ args, err := req.ToGetBlockArgs()
+ if err != nil {
+ return err
+ }
+ return xeth.GetBlock(args, reply)
+ default:
+ return NewErrorResponse(ErrorNotImplemented)
+ }
+
+ jsonlogger.DebugDetailf("Reply: %T %s", reply, reply)
+ return nil
+}
+
var JSON jsonWrapper