From 32bed50ba107ff69ff489e4df6f935fd404a5caa Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 12 Jan 2015 23:25:29 -0600 Subject: begin conversion to rpc over http Per specification at https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC --- rpc/server.go | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) (limited to 'rpc/server.go') diff --git a/rpc/server.go b/rpc/server.go index 983dc6c33..39b955dff 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -3,8 +3,7 @@ package rpc import ( "fmt" "net" - "net/rpc" - "net/rpc/jsonrpc" + "net/http" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/xeth" @@ -38,17 +37,14 @@ func (s *JsonRpcServer) Stop() { func (s *JsonRpcServer) Start() { jsonlogger.Infoln("Starting JSON-RPC server") go s.exitHandler() - rpc.Register(&EthereumApi{pipe: s.pipe}) - rpc.HandleHTTP() - for { - conn, err := s.listener.Accept() - if err != nil { - jsonlogger.Infoln("Error starting JSON-RPC:", err) - break - } - jsonlogger.Debugln("Incoming request.") - go jsonrpc.ServeConn(conn) + h := apiHandler(&EthereumApi{pipe: s.pipe}) + http.Handle("/", h) + + err := http.Serve(s.listener, nil) + // TODO Complains on shutdown due to listner already being closed + if err != nil { + jsonlogger.Errorln("Error on JSON-RPC interface:", err) } } @@ -65,3 +61,28 @@ func NewJsonRpcServer(pipe *xeth.JSXEth, port int) (*JsonRpcServer, error) { pipe: pipe, }, nil } + +func apiHandler(xeth *EthereumApi) http.Handler { + fn := func(w http.ResponseWriter, req *http.Request) { + jsonlogger.Debugln("Handling request") + + reqParsed, reqerr := JSON.ParseRequestBody(req) + if reqerr != nil { + JSON.Send(w, &RpcErrorResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: true, ErrorText: ErrorParseRequest}) + return + } + + var response interface{} + reserr := JSON.GetRequestReply(xeth, &reqParsed, &response) + if reserr != nil { + jsonlogger.Errorln(reserr) + JSON.Send(w, &RpcErrorResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: true, ErrorText: reserr.Error()}) + return + } + + jsonlogger.Debugf("Generated response: %T %s", response, response) + JSON.Send(w, &RpcSuccessResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: false, Result: response}) + } + + return http.HandlerFunc(fn) +} -- cgit v1.2.3 From b178414a475aa48764622487223237a7d28edd46 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Tue, 13 Jan 2015 09:13:43 -0600 Subject: Added license headers --- rpc/server.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'rpc/server.go') diff --git a/rpc/server.go b/rpc/server.go index 39b955dff..56b16b649 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -1,3 +1,19 @@ +/* + This file is part of go-ethereum + + go-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + go-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with go-ethereum. If not, see . +*/ package rpc import ( -- cgit v1.2.3 From a81d835e4d27f600fac31f74d938d0b6502c3072 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Tue, 13 Jan 2015 09:37:08 -0600 Subject: cleanup --- rpc/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'rpc/server.go') diff --git a/rpc/server.go b/rpc/server.go index 56b16b649..d14f50f24 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -58,7 +58,7 @@ func (s *JsonRpcServer) Start() { http.Handle("/", h) err := http.Serve(s.listener, nil) - // TODO Complains on shutdown due to listner already being closed + // FIX Complains on shutdown due to listner already being closed if err != nil { jsonlogger.Errorln("Error on JSON-RPC interface:", err) } -- cgit v1.2.3 From 215780ab562b940bfc653c16bf84f812ef062821 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Tue, 20 Jan 2015 13:58:51 -0600 Subject: Move GetRequestReply to EthereumApi Off of jsonWrapper --- rpc/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'rpc/server.go') diff --git a/rpc/server.go b/rpc/server.go index d14f50f24..a4cf1aa7c 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -89,7 +89,7 @@ func apiHandler(xeth *EthereumApi) http.Handler { } var response interface{} - reserr := JSON.GetRequestReply(xeth, &reqParsed, &response) + reserr := xeth.GetRequestReply(&reqParsed, &response) if reserr != nil { jsonlogger.Errorln(reserr) JSON.Send(w, &RpcErrorResponse{JsonRpc: reqParsed.JsonRpc, ID: reqParsed.ID, Error: true, ErrorText: reserr.Error()}) -- cgit v1.2.3