aboutsummaryrefslogtreecommitdiffstats
path: root/rpc/http.go
diff options
context:
space:
mode:
authorAndy <mortimer.tyrannus@gmail.com>2015-04-21 05:05:13 +0800
committerAndy <mortimer.tyrannus@gmail.com>2015-04-21 05:05:13 +0800
commit8d85e45c7d4fb294d1ba3030000c32f7babbbd13 (patch)
tree1d3e1e2e5328ca17c1aa7f3eb688b44f4edb2adb /rpc/http.go
parent59a7405a8072b735472de885c33c2a82fcf7a162 (diff)
parent99e825ad96e7b3f655f170a52ad6e408b6feb311 (diff)
downloadgo-tangerine-8d85e45c7d4fb294d1ba3030000c32f7babbbd13.tar
go-tangerine-8d85e45c7d4fb294d1ba3030000c32f7babbbd13.tar.gz
go-tangerine-8d85e45c7d4fb294d1ba3030000c32f7babbbd13.tar.bz2
go-tangerine-8d85e45c7d4fb294d1ba3030000c32f7babbbd13.tar.lz
go-tangerine-8d85e45c7d4fb294d1ba3030000c32f7babbbd13.tar.xz
go-tangerine-8d85e45c7d4fb294d1ba3030000c32f7babbbd13.tar.zst
go-tangerine-8d85e45c7d4fb294d1ba3030000c32f7babbbd13.zip
syncing to develop
Diffstat (limited to 'rpc/http.go')
-rw-r--r--rpc/http.go25
1 files changed, 21 insertions, 4 deletions
diff --git a/rpc/http.go b/rpc/http.go
index 790442a28..f9c646908 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 *stoppableTCPListener
const (
jsonrpcver = "2.0"
@@ -22,11 +22,19 @@ 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 {
+ 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 := 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
}
+ rpclistener = l
var handler http.Handler
if len(config.CorsDomain) > 0 {
@@ -35,9 +43,9 @@ 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)
+ handler = newStoppableHandler(JSONRPC(pipe), l.stop)
}
go http.Serve(l, handler)
@@ -45,6 +53,15 @@ func Start(pipe *xeth.XEth, config RpcConfig) error {
return nil
}
+func Stop() error {
+ if rpclistener != 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)