func (s *ServerImpl) sendResponse(sending *sync.Mutex, req *rpc.Request, resp *rpc.Response, reply interface{}, codec rpc.ServerCodec, errmsg string) { resp.ServiceMethod = req.ServiceMethod if errmsg != "" { resp.Error = errmsg reply = invalidRequest } resp.Seq = req.Seq sending.Lock() defer sending.Unlock() err := codec.WriteResponse(resp, reply) if err != nil { log.Println("rpc: writing response:", err) } }
// sendResponses sends a stream of responses on a connection, and // exits when the channel is closed. func (s *Server) sendResponses(codec rpc.ServerCodec, responses <-chan serverResponse) { for resp := range responses { rpcResp := rpc.Response{ ServiceMethod: resp.req.ServiceMethod, Seq: resp.req.Seq, } if resp.err != nil { rpcResp.Error = resp.err.Error() } if err := codec.WriteResponse(&rpcResp, resp.reply); err != nil { log.Warningf("rpc: write response failed: %s", err) // TODO(bdarnell): what to do at this point? close the connection? // net/rpc just swallows the error. } } }