From 60c2ccd99cd9acdb628a9ba5e16ad0e7e52b7e17 Mon Sep 17 00:00:00 2001
From: Bas van Kervel <bas@ethdev.com>
Date: Tue, 16 Jun 2015 11:16:50 +0200
Subject: made ipc handler generic and reusable

---
 rpc/comms/comms.go    | 38 ++++++++++++++++++++++++++++++++++++++
 rpc/comms/ipc_unix.go | 29 +----------------------------
 2 files changed, 39 insertions(+), 28 deletions(-)

(limited to 'rpc')

diff --git a/rpc/comms/comms.go b/rpc/comms/comms.go
index 244f5a7a6..3f458adfd 100644
--- a/rpc/comms/comms.go
+++ b/rpc/comms/comms.go
@@ -1,7 +1,45 @@
 package comms
 
+import (
+	"io"
+	"net"
+
+	"github.com/ethereum/go-ethereum/logger"
+	"github.com/ethereum/go-ethereum/logger/glog"
+	"github.com/ethereum/go-ethereum/rpc/api"
+	"github.com/ethereum/go-ethereum/rpc/codec"
+	"github.com/ethereum/go-ethereum/rpc/shared"
+)
+
 type EthereumClient interface {
 	Close()
 	Send(interface{}) error
 	Recv() (interface{}, error)
 }
+
+func handle(conn net.Conn, api api.EthereumApi, c codec.Codec) {
+	codec := c.New(conn)
+
+	for {
+		req, err := codec.ReadRequest()
+		if err == io.EOF {
+			codec.Close()
+			return
+		} else if err != nil {
+			glog.V(logger.Error).Infof("IPC recv err - %v\n", err)
+			codec.Close()
+			return
+		}
+
+		var rpcResponse interface{}
+		res, err := api.Execute(req)
+
+		rpcResponse = shared.NewRpcResponse(req.Id, req.Jsonrpc, res, err)
+		err = codec.WriteResponse(rpcResponse)
+		if err != nil {
+			glog.V(logger.Error).Infof("comms send err - %v\n", err)
+			codec.Close()
+			return
+		}
+	}
+}
diff --git a/rpc/comms/ipc_unix.go b/rpc/comms/ipc_unix.go
index 5a94fd1e0..131fb86f2 100644
--- a/rpc/comms/ipc_unix.go
+++ b/rpc/comms/ipc_unix.go
@@ -3,7 +3,6 @@
 package comms
 
 import (
-	"io"
 	"net"
 	"os"
 
@@ -11,7 +10,6 @@ import (
 	"github.com/ethereum/go-ethereum/logger/glog"
 	"github.com/ethereum/go-ethereum/rpc/api"
 	"github.com/ethereum/go-ethereum/rpc/codec"
-	"github.com/ethereum/go-ethereum/rpc/shared"
 )
 
 func newIpcClient(cfg IpcConfig, codec codec.Codec) (*ipcClient, error) {
@@ -40,32 +38,7 @@ func startIpc(cfg IpcConfig, codec codec.Codec, api api.EthereumApi) error {
 				continue
 			}
 
-			go func(conn net.Conn) {
-				codec := codec.New(conn)
-
-				for {
-					req, err := codec.ReadRequest()
-					if err == io.EOF {
-						codec.Close()
-						return
-					} else if err != nil {
-						glog.V(logger.Error).Infof("IPC recv err - %v\n", err)
-						codec.Close()
-						return
-					}
-
-					var rpcResponse interface{}
-					res, err := api.Execute(req)
-
-					rpcResponse = shared.NewRpcResponse(req.Id, req.Jsonrpc, res, err)
-					err = codec.WriteResponse(rpcResponse)
-					if err != nil {
-						glog.V(logger.Error).Infof("IPC send err - %v\n", err)
-						codec.Close()
-						return
-					}
-				}
-			}(conn)
+			go handle(conn, api, codec)
 		}
 
 		os.Remove(cfg.Endpoint)
-- 
cgit v1.2.3