From 10b252dd0517175117d8d4a8ef30b3689a10eda5 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 21 Oct 2014 13:24:48 +0200 Subject: WIP RPC interface --- rpc/server.go | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 rpc/server.go (limited to 'rpc/server.go') diff --git a/rpc/server.go b/rpc/server.go new file mode 100644 index 000000000..db12c747c --- /dev/null +++ b/rpc/server.go @@ -0,0 +1,67 @@ +package rpc + +import ( + "fmt" + "net" + "net/rpc" + "net/rpc/jsonrpc" + + "github.com/ethereum/eth-go/ethlog" + "github.com/ethereum/eth-go/ethpipe" +) + +var logger = ethlog.NewLogger("JSON") + +type JsonRpcServer struct { + quit chan bool + listener net.Listener + pipe *ethpipe.JSPipe +} + +func (s *JsonRpcServer) exitHandler() { +out: + for { + select { + case <-s.quit: + s.listener.Close() + break out + } + } + + logger.Infoln("Shutdown JSON-RPC server") +} + +func (s *JsonRpcServer) Stop() { + close(s.quit) +} + +func (s *JsonRpcServer) Start() { + logger.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 { + logger.Infoln("Error starting JSON-RPC:", err) + break + } + logger.Debugln("Incoming request.") + go jsonrpc.ServeConn(conn) + } +} + +func NewJsonRpcServer(pipe *ethpipe.JSPipe, port int) (*JsonRpcServer, error) { + sport := fmt.Sprintf(":%d", port) + l, err := net.Listen("tcp", sport) + if err != nil { + return nil, err + } + + return &JsonRpcServer{ + listener: l, + quit: make(chan bool), + pipe: pipe, + }, nil +} -- cgit v1.2.3