diff options
author | Taylor Gerring <taylor.gerring@gmail.com> | 2015-03-11 11:25:32 +0800 |
---|---|---|
committer | Taylor Gerring <taylor.gerring@gmail.com> | 2015-03-11 11:25:32 +0800 |
commit | 6bca40274f2056b8516543d8cc1600224789b77f (patch) | |
tree | f74e9999e5892784dfd134bbc2803a76f0c176ca /rpc/http.go | |
parent | 9ce5229ddfccfccf1215e44477b665de031e4e1e (diff) | |
parent | 074ee19fe51a025a00bc3814748b268ae74c046c (diff) | |
download | go-tangerine-6bca40274f2056b8516543d8cc1600224789b77f.tar go-tangerine-6bca40274f2056b8516543d8cc1600224789b77f.tar.gz go-tangerine-6bca40274f2056b8516543d8cc1600224789b77f.tar.bz2 go-tangerine-6bca40274f2056b8516543d8cc1600224789b77f.tar.lz go-tangerine-6bca40274f2056b8516543d8cc1600224789b77f.tar.xz go-tangerine-6bca40274f2056b8516543d8cc1600224789b77f.tar.zst go-tangerine-6bca40274f2056b8516543d8cc1600224789b77f.zip |
Merge branch 'rpcfrontier' of github.com:ethereum/go-ethereum into rpcfrontier
Diffstat (limited to 'rpc/http.go')
-rw-r--r-- | rpc/http.go | 52 |
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}) + }) +} |