From f30937c55e130b9e9a61c78ca88fcb404d5526bc Mon Sep 17 00:00:00 2001 From: Umputun Date: Fri, 21 Jun 2019 00:06:23 -0500 Subject: [PATCH] fix empty (no args) remote calls --- backend/app/store/remote/client.go | 11 +++++++++-- backend/app/store/remote/client_test.go | 12 ++++++++++++ backend/app/store/remote/server.go | 8 +++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/backend/app/store/remote/client.go b/backend/app/store/remote/client.go index 9e5eb796..5317ed45 100644 --- a/backend/app/store/remote/client.go +++ b/backend/app/store/remote/client.go @@ -25,12 +25,19 @@ func (r *Client) Call(method string, args ...interface{}) (*Response, error) { var b []byte var err error - if len(args) == 1 && reflect.TypeOf(args[0]).Kind() == reflect.Struct { + + switch { + case args == nil || len(args) == 0: + b, err = json.Marshal(Request{Method: method, ID: atomic.AddUint64(&r.id, 1)}) + if err != nil { + return nil, errors.Wrapf(err, "marshaling failed for %s", method) + } + case len(args) == 1 && reflect.TypeOf(args[0]).Kind() == reflect.Struct: b, err = json.Marshal(Request{Method: method, Params: args[0], ID: atomic.AddUint64(&r.id, 1)}) if err != nil { return nil, errors.Wrapf(err, "marshaling failed for %s", method) } - } else { + default: b, err = json.Marshal(Request{Method: method, Params: args, ID: atomic.AddUint64(&r.id, 1)}) if err != nil { return nil, errors.Wrapf(err, "marshaling failed for %s", method) diff --git a/backend/app/store/remote/client_test.go b/backend/app/store/remote/client_test.go index 98a2c794..59799031 100644 --- a/backend/app/store/remote/client_test.go +++ b/backend/app/store/remote/client_test.go @@ -47,6 +47,18 @@ func TestClient_CallWithObject(t *testing.T) { t.Logf("%v %T", res, res) } +func TestClient_CallWithNoParams(t *testing.T) { + ts := testServer(t, `{"method":"test","id":1}`, `{"result":"12345"}`) + defer ts.Close() + c := Client{API: ts.URL, Client: http.Client{}} + resp, err := c.Call("test") + assert.NoError(t, err) + res := "" + err = json.Unmarshal(*resp.Result, &res) + assert.Equal(t, "12345", res) + t.Logf("%v %T", res, res) +} + func TestClient_CallError(t *testing.T) { ts := testServer(t, `{"method":"test","params":[123,"abc"],"id":1}`, `{"error":"some error"}`) defer ts.Close() diff --git a/backend/app/store/remote/server.go b/backend/app/store/remote/server.go index c44e4e1a..49082af3 100644 --- a/backend/app/store/remote/server.go +++ b/backend/app/store/remote/server.go @@ -129,7 +129,13 @@ func (s *Server) handler(w http.ResponseWriter, r *http.Request) { rest.SendErrorJSON(w, r, http.StatusNotImplemented, errors.New("unsupported method"), req.Method, 0) return } - render.JSON(w, r, fn(req.ID, *req.Params)) + + params := json.RawMessage{} + if req.Params != nil { + params = *req.Params + } + + render.JSON(w, r, fn(req.ID, params)) } func (s *Server) basicAuth(h http.Handler) http.Handler {