diff --git a/lib/jsonrpc/client.go b/lib/jsonrpc/client.go index 145d54d62..d03600f86 100644 --- a/lib/jsonrpc/client.go +++ b/lib/jsonrpc/client.go @@ -169,8 +169,8 @@ func NewClient(addr string, namespace string, handler interface{}) (ClientCloser requests <- clientRequest{ req: request{ Jsonrpc: "2.0", - Method: wsCancel, - Params: []param{{v: reflect.ValueOf(id)}}, + Method: wsCancel, + Params: []param{{v: reflect.ValueOf(id)}}, }, } } diff --git a/lib/jsonrpc/rpc_test.go b/lib/jsonrpc/rpc_test.go index 3366f6fa3..f52d71792 100644 --- a/lib/jsonrpc/rpc_test.go +++ b/lib/jsonrpc/rpc_test.go @@ -69,7 +69,7 @@ func TestRPC(t *testing.T) { AddGet func(int) int StringMatch func(t TestType, i2 int64) (out TestOut, err error) } - closer, err := NewClient("ws://" + testServ.Listener.Addr().String(), "SimpleServerHandler", &client) + closer, err := NewClient("ws://"+testServ.Listener.Addr().String(), "SimpleServerHandler", &client) if err != nil { t.Fatal(err) } @@ -132,7 +132,7 @@ func TestRPC(t *testing.T) { var noret struct { Add func(int) } - closer, err = NewClient("ws://" + testServ.Listener.Addr().String(), "SimpleServerHandler", &noret) + closer, err = NewClient("ws://"+testServ.Listener.Addr().String(), "SimpleServerHandler", &noret) if err != nil { t.Fatal(err) } @@ -147,7 +147,7 @@ func TestRPC(t *testing.T) { var noparam struct { Add func() } - closer, err = NewClient("ws://" + testServ.Listener.Addr().String(), "SimpleServerHandler", &noparam) + closer, err = NewClient("ws://"+testServ.Listener.Addr().String(), "SimpleServerHandler", &noparam) if err != nil { t.Fatal(err) } @@ -159,7 +159,7 @@ func TestRPC(t *testing.T) { var erronly struct { AddGet func() (int, error) } - closer, err = NewClient("ws://" + testServ.Listener.Addr().String(), "SimpleServerHandler", &erronly) + closer, err = NewClient("ws://"+testServ.Listener.Addr().String(), "SimpleServerHandler", &erronly) if err != nil { t.Fatal(err) } @@ -173,7 +173,7 @@ func TestRPC(t *testing.T) { var wrongtype struct { Add func(string) error } - closer, err = NewClient("ws://" + testServ.Listener.Addr().String(), "SimpleServerHandler", &wrongtype) + closer, err = NewClient("ws://"+testServ.Listener.Addr().String(), "SimpleServerHandler", &wrongtype) if err != nil { t.Fatal(err) } @@ -187,7 +187,7 @@ func TestRPC(t *testing.T) { var notfound struct { NotThere func(string) error } - closer, err = NewClient("ws://" + testServ.Listener.Addr().String(), "SimpleServerHandler", ¬found) + closer, err = NewClient("ws://"+testServ.Listener.Addr().String(), "SimpleServerHandler", ¬found) if err != nil { t.Fatal(err) } @@ -236,7 +236,7 @@ func TestCtx(t *testing.T) { var client struct { Test func(ctx context.Context) } - closer, err := NewClient("ws://" + testServ.Listener.Addr().String(), "CtxHandler", &client) + closer, err := NewClient("ws://"+testServ.Listener.Addr().String(), "CtxHandler", &client) if err != nil { t.Fatal(err) } @@ -259,7 +259,7 @@ func TestCtx(t *testing.T) { var noCtxClient struct { Test func() } - closer, err = NewClient("ws://" + testServ.Listener.Addr().String(), "CtxHandler", &noCtxClient) + closer, err = NewClient("ws://"+testServ.Listener.Addr().String(), "CtxHandler", &noCtxClient) if err != nil { t.Fatal(err) } diff --git a/lib/jsonrpc/server.go b/lib/jsonrpc/server.go index 457463846..fdf3a5a67 100644 --- a/lib/jsonrpc/server.go +++ b/lib/jsonrpc/server.go @@ -35,9 +35,13 @@ func (s *RPCServer) handleWS(w http.ResponseWriter, r *http.Request) { w.WriteHeader(500) return } - defer c.Close() handleWsConn(r.Context(), c, s.methods, nil, nil) + + if err := c.Close(); err != nil { + log.Error(err) + return + } } // TODO: return errors to clients per spec diff --git a/lib/jsonrpc/websocket.go b/lib/jsonrpc/websocket.go index 3fede6b12..6d21be1e0 100644 --- a/lib/jsonrpc/websocket.go +++ b/lib/jsonrpc/websocket.go @@ -15,16 +15,16 @@ const wsCancel = "xrpc.cancel" type frame struct { // common - Jsonrpc string `json:"jsonrpc"` - ID *int64 `json:"id,omitempty"` + Jsonrpc string `json:"jsonrpc"` + ID *int64 `json:"id,omitempty"` // request - Method string `json:"method,omitempty"` - Params []param `json:"params,omitempty"` + Method string `json:"method,omitempty"` + Params []param `json:"params,omitempty"` // response - Result result `json:"result,omitempty"` - Error *respError `json:"error,omitempty"` + Result result `json:"result,omitempty"` + Error *respError `json:"error,omitempty"` } func handleWsConn(ctx context.Context, conn *websocket.Conn, handler handlers, requests <-chan clientRequest, stop <-chan struct{}) { @@ -137,11 +137,10 @@ func handleWsConn(ctx context.Context, conn *websocket.Conn, handler handlers, r nw := func(cb func(io.Writer)) { cb(ioutil.Discard) } - done := func(){} + done := cf if frame.ID != nil { nw = nextWriter - handlingLk.Lock() handling[*frame.ID] = cf handlingLk.Unlock() @@ -150,7 +149,6 @@ func handleWsConn(ctx context.Context, conn *websocket.Conn, handler handlers, r handlingLk.Lock() defer handlingLk.Unlock() - cf := handling[*frame.ID] cf() delete(handling, *frame.ID) }