1
0
mirror of https://github.com/golang/go synced 2024-11-25 07:17:56 -07:00

rpc: properly discard values.

R=r, rsc, r2
CC=golang-dev
https://golang.org/cl/4171050
This commit is contained in:
Roger Peppe 2011-02-14 14:51:08 -08:00 committed by Rob Pike
parent ff7d7b271f
commit 34dd450fb8
4 changed files with 14 additions and 6 deletions

View File

@ -53,7 +53,9 @@ type Client struct {
// The client calls WriteRequest to write a request to the connection // The client calls WriteRequest to write a request to the connection
// and calls ReadResponseHeader and ReadResponseBody in pairs // and calls ReadResponseHeader and ReadResponseBody in pairs
// to read responses. The client calls Close when finished with the // to read responses. The client calls Close when finished with the
// connection. // connection. ReadResponseBody may be called with a nil
// argument to force the body of the response to be read and then
// discarded.
type ClientCodec interface { type ClientCodec interface {
WriteRequest(*Request, interface{}) os.Error WriteRequest(*Request, interface{}) os.Error
ReadResponseHeader(*Response) os.Error ReadResponseHeader(*Response) os.Error
@ -89,7 +91,6 @@ func (client *Client) send(c *Call) {
func (client *Client) input() { func (client *Client) input() {
var err os.Error var err os.Error
var marker struct{}
for err == nil { for err == nil {
response := new(Response) response := new(Response)
err = client.codec.ReadResponseHeader(response) err = client.codec.ReadResponseHeader(response)
@ -115,7 +116,7 @@ func (client *Client) input() {
// any subsequent requests will get the ReadResponseBody // any subsequent requests will get the ReadResponseBody
// error if there is one. // error if there is one.
c.Error = ServerError(response.Error) c.Error = ServerError(response.Error)
err = client.codec.ReadResponseBody(&marker) err = client.codec.ReadResponseBody(nil)
if err != nil { if err != nil {
err = os.ErrorString("reading error body: " + err.String()) err = os.ErrorString("reading error body: " + err.String())
} }

View File

@ -98,6 +98,9 @@ func (c *clientCodec) ReadResponseHeader(r *rpc.Response) os.Error {
} }
func (c *clientCodec) ReadResponseBody(x interface{}) os.Error { func (c *clientCodec) ReadResponseBody(x interface{}) os.Error {
if x == nil {
return nil
}
return json.Unmarshal(*c.resp.Result, x) return json.Unmarshal(*c.resp.Result, x)
} }

View File

@ -85,6 +85,9 @@ func (c *serverCodec) ReadRequestHeader(r *rpc.Request) os.Error {
} }
func (c *serverCodec) ReadRequestBody(x interface{}) os.Error { func (c *serverCodec) ReadRequestBody(x interface{}) os.Error {
if x == nil {
return nil
}
// JSON params is array value. // JSON params is array value.
// RPC params is struct. // RPC params is struct.
// Unmarshal into array containing struct for now. // Unmarshal into array containing struct for now.

View File

@ -302,7 +302,7 @@ type InvalidRequest struct {
Marker int Marker int
} }
var invalidRequest = InvalidRequest{1} var invalidRequest = InvalidRequest{}
func _new(t *reflect.PtrType) *reflect.PtrValue { func _new(t *reflect.PtrType) *reflect.PtrValue {
v := reflect.MakeZero(t).(*reflect.PtrValue) v := reflect.MakeZero(t).(*reflect.PtrValue)
@ -399,7 +399,7 @@ func (server *Server) ServeCodec(codec ServerCodec) {
break break
} }
// discard body // discard body
codec.ReadRequestBody(new(interface{})) codec.ReadRequestBody(nil)
// send a response if we actually managed to read a header. // send a response if we actually managed to read a header.
if req != nil { if req != nil {
@ -486,7 +486,8 @@ func RegisterName(name string, rcvr interface{}) os.Error {
// The server calls ReadRequestHeader and ReadRequestBody in pairs // The server calls ReadRequestHeader and ReadRequestBody in pairs
// to read requests from the connection, and it calls WriteResponse to // to read requests from the connection, and it calls WriteResponse to
// write a response back. The server calls Close when finished with the // write a response back. The server calls Close when finished with the
// connection. // connection. ReadRequestBody may be called with a nil
// argument to force the body of the request to be read and discarded.
type ServerCodec interface { type ServerCodec interface {
ReadRequestHeader(*Request) os.Error ReadRequestHeader(*Request) os.Error
ReadRequestBody(interface{}) os.Error ReadRequestBody(interface{}) os.Error