From 57f93d25bd9a09f4a68307342ad44a5af1d5dc26 Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Thu, 16 Apr 2015 12:56:51 +0200 Subject: admin.stopRPC support added which stops the RPC HTTP listener --- rpc/http.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'rpc/http.go') diff --git a/rpc/http.go b/rpc/http.go index 790442a28..61f8da549 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -5,7 +5,6 @@ import ( "fmt" "io" "io/ioutil" - "net" "net/http" "github.com/ethereum/go-ethereum/logger" @@ -15,6 +14,7 @@ import ( ) var rpclogger = logger.NewLogger("RPC") +var rpclistener *ControllableTCPListener const ( jsonrpcver = "2.0" @@ -22,11 +22,17 @@ const ( ) func Start(pipe *xeth.XEth, config RpcConfig) error { - l, err := net.Listen("tcp", fmt.Sprintf("%s:%d", config.ListenAddress, config.ListenPort)) + if rpclistener != nil { // listener already running + glog.Infoln("RPC listener already running") + return fmt.Errorf("RPC already running on %s", rpclistener.Addr().String()) + } + + l, err := NewControllableTCPListener(fmt.Sprintf("%s:%d", config.ListenAddress, config.ListenPort)) if err != nil { rpclogger.Errorf("Can't listen on %s:%d: %v", config.ListenAddress, config.ListenPort, err) return err } + rpclistener = l var handler http.Handler if len(config.CorsDomain) > 0 { @@ -45,6 +51,17 @@ func Start(pipe *xeth.XEth, config RpcConfig) error { return nil } +func Stop() error { + if rpclistener == nil { // listener not running + glog.Infoln("RPC listener not running") + return nil + } + + rpclistener.Stop() + rpclistener = nil + return nil +} + // JSONRPC returns a handler that implements the Ethereum JSON-RPC API. func JSONRPC(pipe *xeth.XEth) http.Handler { api := NewEthereumApi(pipe) -- cgit v1.2.3 From ead3dd9759c9cc8076ad716fe10cf641751b65b0 Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Thu, 16 Apr 2015 19:23:57 +0200 Subject: Stop accepted and alive connections (http keep-alive) when the rpc service is stopped --- rpc/http.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'rpc/http.go') diff --git a/rpc/http.go b/rpc/http.go index 61f8da549..882aff7ea 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -14,7 +14,7 @@ import ( ) var rpclogger = logger.NewLogger("RPC") -var rpclistener *ControllableTCPListener +var rpclistener *StoppableTCPListener const ( jsonrpcver = "2.0" @@ -22,12 +22,14 @@ const ( ) func Start(pipe *xeth.XEth, config RpcConfig) error { - if rpclistener != nil { // listener already running - glog.Infoln("RPC listener already running") - return fmt.Errorf("RPC already running on %s", rpclistener.Addr().String()) + if rpclistener != nil { + if fmt.Sprintf("%s:%d", config.ListenAddress, config.ListenPort) != rpclistener.Addr().String() { + return fmt.Errorf("RPC service already running on %s ", rpclistener.Addr().String()) + } + return nil // RPC service already running on given host/port } - l, err := NewControllableTCPListener(fmt.Sprintf("%s:%d", config.ListenAddress, config.ListenPort)) + l, err := NewStoppableTCPListener(fmt.Sprintf("%s:%d", config.ListenAddress, config.ListenPort)) if err != nil { rpclogger.Errorf("Can't listen on %s:%d: %v", config.ListenAddress, config.ListenPort, err) return err @@ -41,7 +43,7 @@ func Start(pipe *xeth.XEth, config RpcConfig) error { opts.AllowedOrigins = []string{config.CorsDomain} c := cors.New(opts) - handler = c.Handler(JSONRPC(pipe)) + handler = NewStoppableHandler(c.Handler(JSONRPC(pipe)), l.stop) } else { handler = JSONRPC(pipe) } @@ -52,13 +54,11 @@ func Start(pipe *xeth.XEth, config RpcConfig) error { } func Stop() error { - if rpclistener == nil { // listener not running - glog.Infoln("RPC listener not running") - return nil + if rpclistener != nil { + rpclistener.Stop() + rpclistener = nil } - rpclistener.Stop() - rpclistener = nil return nil } -- cgit v1.2.3 From 2c229bac003b30908fd0dc0d69d35044c6cb2425 Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Sun, 19 Apr 2015 09:55:41 +0200 Subject: Replaced channel pointer field with non pointer channel --- rpc/http.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'rpc/http.go') diff --git a/rpc/http.go b/rpc/http.go index 882aff7ea..5ff4f613b 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -45,7 +45,7 @@ func Start(pipe *xeth.XEth, config RpcConfig) error { c := cors.New(opts) handler = NewStoppableHandler(c.Handler(JSONRPC(pipe)), l.stop) } else { - handler = JSONRPC(pipe) + handler = NewStoppableHandler(JSONRPC(pipe), l.stop) } go http.Serve(l, handler) -- cgit v1.2.3 From 61885aa965282d5879b9c4fbb740e96e9b680558 Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Sun, 19 Apr 2015 10:01:50 +0200 Subject: Don't export types/functions --- rpc/http.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'rpc/http.go') diff --git a/rpc/http.go b/rpc/http.go index 5ff4f613b..f9c646908 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -14,7 +14,7 @@ import ( ) var rpclogger = logger.NewLogger("RPC") -var rpclistener *StoppableTCPListener +var rpclistener *stoppableTCPListener const ( jsonrpcver = "2.0" @@ -29,7 +29,7 @@ func Start(pipe *xeth.XEth, config RpcConfig) error { return nil // RPC service already running on given host/port } - l, err := NewStoppableTCPListener(fmt.Sprintf("%s:%d", config.ListenAddress, config.ListenPort)) + l, err := newStoppableTCPListener(fmt.Sprintf("%s:%d", config.ListenAddress, config.ListenPort)) if err != nil { rpclogger.Errorf("Can't listen on %s:%d: %v", config.ListenAddress, config.ListenPort, err) return err @@ -43,9 +43,9 @@ func Start(pipe *xeth.XEth, config RpcConfig) error { opts.AllowedOrigins = []string{config.CorsDomain} c := cors.New(opts) - handler = NewStoppableHandler(c.Handler(JSONRPC(pipe)), l.stop) + handler = newStoppableHandler(c.Handler(JSONRPC(pipe)), l.stop) } else { - handler = NewStoppableHandler(JSONRPC(pipe), l.stop) + handler = newStoppableHandler(JSONRPC(pipe), l.stop) } go http.Serve(l, handler) -- cgit v1.2.3