diff options
author | Ondřej Surý <ondrej@sury.org> | 2011-01-17 12:40:45 +0100 |
---|---|---|
committer | Ondřej Surý <ondrej@sury.org> | 2011-01-17 12:40:45 +0100 |
commit | 3e45412327a2654a77944249962b3652e6142299 (patch) | |
tree | bc3bf69452afa055423cbe0c5cfa8ca357df6ccf /src/pkg/rpc/jsonrpc | |
parent | c533680039762cacbc37db8dc7eed074c3e497be (diff) | |
download | golang-upstream/2011.01.12.tar.gz |
Imported Upstream version 2011.01.12upstream/2011.01.12
Diffstat (limited to 'src/pkg/rpc/jsonrpc')
-rw-r--r-- | src/pkg/rpc/jsonrpc/Makefile | 2 | ||||
-rw-r--r-- | src/pkg/rpc/jsonrpc/all_test.go | 13 | ||||
-rw-r--r-- | src/pkg/rpc/jsonrpc/client.go | 17 | ||||
-rw-r--r-- | src/pkg/rpc/jsonrpc/server.go | 14 |
4 files changed, 38 insertions, 8 deletions
diff --git a/src/pkg/rpc/jsonrpc/Makefile b/src/pkg/rpc/jsonrpc/Makefile index 1a4fd2e92..b9a1ac2f7 100644 --- a/src/pkg/rpc/jsonrpc/Makefile +++ b/src/pkg/rpc/jsonrpc/Makefile @@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. -include ../../../Make.$(GOARCH) +include ../../../Make.inc TARG=rpc/jsonrpc GOFILES=\ diff --git a/src/pkg/rpc/jsonrpc/all_test.go b/src/pkg/rpc/jsonrpc/all_test.go index e94c594da..764ee7ff3 100644 --- a/src/pkg/rpc/jsonrpc/all_test.go +++ b/src/pkg/rpc/jsonrpc/all_test.go @@ -53,7 +53,7 @@ func TestServer(t *testing.T) { type addResp struct { Id interface{} "id" Result Reply "result" - Error string "error" + Error interface{} "error" } cli, srv := net.Pipe() @@ -69,7 +69,7 @@ func TestServer(t *testing.T) { if err != nil { t.Fatalf("Decode: %s", err) } - if resp.Error != "" { + if resp.Error != nil { t.Fatalf("resp.Error: %s", resp.Error) } if resp.Id.(string) != string(i) { @@ -79,6 +79,15 @@ func TestServer(t *testing.T) { t.Fatalf("resp: bad result: %d+%d=%d", i, i+1, resp.Result.C) } } + + fmt.Fprintf(cli, "{}\n") + var resp addResp + if err := dec.Decode(&resp); err != nil { + t.Fatalf("Decode after empty: %s", err) + } + if resp.Error == nil { + t.Fatalf("Expected error, got nil") + } } func TestClient(t *testing.T) { diff --git a/src/pkg/rpc/jsonrpc/client.go b/src/pkg/rpc/jsonrpc/client.go index ed2b4ed37..dcaa69f9d 100644 --- a/src/pkg/rpc/jsonrpc/client.go +++ b/src/pkg/rpc/jsonrpc/client.go @@ -7,6 +7,7 @@ package jsonrpc import ( + "fmt" "io" "json" "net" @@ -61,13 +62,13 @@ func (c *clientCodec) WriteRequest(r *rpc.Request, param interface{}) os.Error { type clientResponse struct { Id uint64 "id" Result *json.RawMessage "result" - Error string "error" + Error interface{} "error" } func (r *clientResponse) reset() { r.Id = 0 r.Result = nil - r.Error = "" + r.Error = nil } func (c *clientCodec) ReadResponseHeader(r *rpc.Response) os.Error { @@ -81,8 +82,18 @@ func (c *clientCodec) ReadResponseHeader(r *rpc.Response) os.Error { c.pending[c.resp.Id] = "", false c.mutex.Unlock() + r.Error = "" r.Seq = c.resp.Id - r.Error = c.resp.Error + if c.resp.Error != nil { + x, ok := c.resp.Error.(string) + if !ok { + return fmt.Errorf("invalid error %v", c.resp.Error) + } + if x == "" { + x = "unspecified error" + } + r.Error = x + } return nil } diff --git a/src/pkg/rpc/jsonrpc/server.go b/src/pkg/rpc/jsonrpc/server.go index 9f3472a39..bf53bda8d 100644 --- a/src/pkg/rpc/jsonrpc/server.go +++ b/src/pkg/rpc/jsonrpc/server.go @@ -61,7 +61,7 @@ func (r *serverRequest) reset() { type serverResponse struct { Id *json.RawMessage "id" Result interface{} "result" - Error string "error" + Error interface{} "error" } func (c *serverCodec) ReadRequestHeader(r *rpc.Request) os.Error { @@ -94,6 +94,8 @@ func (c *serverCodec) ReadRequestBody(x interface{}) os.Error { return json.Unmarshal(*c.req.Params, ¶ms) } +var null = json.RawMessage([]byte("null")) + func (c *serverCodec) WriteResponse(r *rpc.Response, x interface{}) os.Error { var resp serverResponse c.mutex.Lock() @@ -105,9 +107,17 @@ func (c *serverCodec) WriteResponse(r *rpc.Response, x interface{}) os.Error { c.pending[r.Seq] = nil, false c.mutex.Unlock() + if b == nil { + // Invalid request so no id. Use JSON null. + b = &null + } resp.Id = b resp.Result = x - resp.Error = r.Error + if r.Error == "" { + resp.Error = nil + } else { + resp.Error = r.Error + } return c.enc.Encode(resp) } |