aboutsummaryrefslogtreecommitdiffstats
path: root/rpc/http.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2015-03-11 08:08:42 +0800
committerobscuren <geffobscura@gmail.com>2015-03-11 08:08:42 +0800
commit7e0ccc9de53e788ddc1879248bceb33a9ccdbae0 (patch)
tree816ff2e06aaa78721a22eee7f2c8493fbf313fb4 /rpc/http.go
parentce595b9266d658a5eae626d78aec7f47c04222ca (diff)
parenteba4f389a6c494bc3e15b3bbc6516b51a5e61236 (diff)
downloadgo-tangerine-7e0ccc9de53e788ddc1879248bceb33a9ccdbae0.tar
go-tangerine-7e0ccc9de53e788ddc1879248bceb33a9ccdbae0.tar.gz
go-tangerine-7e0ccc9de53e788ddc1879248bceb33a9ccdbae0.tar.bz2
go-tangerine-7e0ccc9de53e788ddc1879248bceb33a9ccdbae0.tar.lz
go-tangerine-7e0ccc9de53e788ddc1879248bceb33a9ccdbae0.tar.xz
go-tangerine-7e0ccc9de53e788ddc1879248bceb33a9ccdbae0.tar.zst
go-tangerine-7e0ccc9de53e788ddc1879248bceb33a9ccdbae0.zip
Merge branch 'develop' into rpcfrontier
Conflicts: rpc/api.go rpc/args.go
Diffstat (limited to 'rpc/http.go')
-rw-r--r--rpc/http.go52
1 files changed, 52 insertions, 0 deletions
diff --git a/rpc/http.go b/rpc/http.go
new file mode 100644
index 000000000..857cf3221
--- /dev/null
+++ b/rpc/http.go
@@ -0,0 +1,52 @@
+package rpc
+
+import (
+ "net/http"
+
+ "github.com/ethereum/go-ethereum/logger"
+ "github.com/ethereum/go-ethereum/xeth"
+)
+
+var rpchttplogger = logger.NewLogger("RPC-HTTP")
+
+const (
+ jsonrpcver = "2.0"
+ maxSizeReqLength = 1024 * 1024 // 1MB
+)
+
+// JSONRPC returns a handler that implements the Ethereum JSON-RPC API.
+func JSONRPC(pipe *xeth.XEth, dataDir string) http.Handler {
+ var json JsonWrapper
+ api := NewEthereumApi(pipe, dataDir)
+
+ return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+ w.Header().Set("Access-Control-Allow-Origin", "*")
+
+ rpchttplogger.DebugDetailln("Handling request")
+
+ if req.ContentLength > maxSizeReqLength {
+ jsonerr := &RpcErrorObject{-32700, "Error: Request too large"}
+ json.Send(w, &RpcErrorResponse{JsonRpc: jsonrpcver, ID: nil, Error: jsonerr})
+ return
+ }
+
+ reqParsed, reqerr := json.ParseRequestBody(req)
+ if reqerr != nil {
+ jsonerr := &RpcErrorObject{-32700, "Error: Could not parse request"}
+ json.Send(w, &RpcErrorResponse{JsonRpc: jsonrpcver, ID: nil, Error: jsonerr})
+ return
+ }
+
+ var response interface{}
+ reserr := api.GetRequestReply(&reqParsed, &response)
+ if reserr != nil {
+ rpchttplogger.Warnln(reserr)
+ jsonerr := &RpcErrorObject{-32603, reserr.Error()}
+ json.Send(w, &RpcErrorResponse{JsonRpc: jsonrpcver, ID: reqParsed.ID, Error: jsonerr})
+ return
+ }
+
+ rpchttplogger.DebugDetailf("Generated response: %T %s", response, response)
+ json.Send(w, &RpcSuccessResponse{JsonRpc: jsonrpcver, ID: reqParsed.ID, Result: response})
+ })
+}