mirror of
https://github.com/golang/go
synced 2024-11-22 03:04:41 -07:00
rpc: properly discard values.
R=r, rsc, r2 CC=golang-dev https://golang.org/cl/4171050
This commit is contained in:
parent
ff7d7b271f
commit
34dd450fb8
@ -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())
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user