Skip to content

Commit d090a97

Browse files
authored
Merge pull request #396 from micro/error
Fix #394 invalid error handling in rpc_router ServeRequest
2 parents d8ba18d + 8a0d5f0 commit d090a97

File tree

2 files changed

+19
-28
lines changed

2 files changed

+19
-28
lines changed

server/rpc_router.go

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -162,27 +162,23 @@ func prepareMethod(method reflect.Method) *methodType {
162162
return &methodType{method: method, ArgType: argType, ReplyType: replyType, ContextType: contextType, stream: stream}
163163
}
164164

165-
func (router *router) sendResponse(sending sync.Locker, req *request, reply interface{}, cc codec.Writer, errmsg string, last bool) (err error) {
165+
func (router *router) sendResponse(sending sync.Locker, req *request, reply interface{}, cc codec.Writer, last bool) error {
166166
msg := new(codec.Message)
167167
msg.Type = codec.Response
168168
resp := router.getResponse()
169169
resp.msg = msg
170170

171-
// Encode the response header
172-
resp.msg.Endpoint = req.msg.Endpoint
173-
if errmsg != "" {
174-
resp.msg.Error = errmsg
175-
reply = invalidRequest
176-
}
177171
resp.msg.Id = req.msg.Id
178172
sending.Lock()
179-
err = cc.Write(resp.msg, reply)
173+
err := cc.Write(resp.msg, reply)
180174
sending.Unlock()
181175
router.freeResponse(resp)
182176
return err
183177
}
184178

185-
func (s *service) call(ctx context.Context, router *router, sending *sync.Mutex, mtype *methodType, req *request, argv, replyv reflect.Value, cc codec.Writer) {
179+
func (s *service) call(ctx context.Context, router *router, sending *sync.Mutex, mtype *methodType, req *request, argv, replyv reflect.Value, cc codec.Writer) error {
180+
defer router.freeRequest(req)
181+
186182
function := mtype.method.Func
187183
var returnValues []reflect.Value
188184

@@ -206,18 +202,13 @@ func (s *service) call(ctx context.Context, router *router, sending *sync.Mutex,
206202
return nil
207203
}
208204

209-
errmsg := ""
210-
err := fn(ctx, r, replyv.Interface())
211-
if err != nil {
212-
errmsg = err.Error()
205+
// execute handler
206+
if err := fn(ctx, r, replyv.Interface()); err != nil {
207+
return err
213208
}
214209

215-
err = router.sendResponse(sending, req, replyv.Interface(), cc, errmsg, true)
216-
if err != nil {
217-
log.Log("rpc call: unable to send response: ", err)
218-
}
219-
router.freeRequest(req)
220-
return
210+
// send response
211+
return router.sendResponse(sending, req, replyv.Interface(), cc, true)
221212
}
222213

223214
// declare a local error to see if we errored out already
@@ -250,16 +241,15 @@ func (s *service) call(ctx context.Context, router *router, sending *sync.Mutex,
250241
// client.Stream request
251242
r.stream = true
252243

253-
errmsg := ""
244+
// execute handler
254245
if err := fn(ctx, r, stream); err != nil {
255-
errmsg = err.Error()
246+
return err
256247
}
257248

258249
// this is the last packet, we don't do anything with
259250
// the error here (well sendStreamResponse will log it
260251
// already)
261-
router.sendResponse(sending, req, nil, cc, errmsg, true)
262-
router.freeRequest(req)
252+
return router.sendResponse(sending, req, nil, cc, true)
263253
}
264254

265255
func (m *methodType) prepareContext(ctx context.Context) reflect.Value {
@@ -448,11 +438,9 @@ func (router *router) ServeRequest(ctx context.Context, r Request, rsp Response)
448438
}
449439
// send a response if we actually managed to read a header.
450440
if req != nil {
451-
router.sendResponse(sending, req, invalidRequest, rsp.Codec(), err.Error(), true)
452441
router.freeRequest(req)
453442
}
454443
return err
455444
}
456-
service.call(ctx, router, sending, mtype, req, argv, replyv, rsp.Codec())
457-
return nil
445+
return service.call(ctx, router, sending, mtype, req, argv, replyv, rsp.Codec())
458446
}

server/rpc_server.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,15 @@ func (s *rpcServer) ServeConn(sock transport.Socket) {
158158
// TODO: handle error better
159159
if err := handler(ctx, request, response); err != nil {
160160
// write an error response
161-
rcodec.Write(&codec.Message{
161+
err = rcodec.Write(&codec.Message{
162162
Header: msg.Header,
163163
Error: err.Error(),
164164
Type: codec.Error,
165165
}, nil)
166-
166+
// could not write the error response
167+
if err != nil {
168+
log.Logf("rpc: unable to write error response: %v", err)
169+
}
167170
s.wg.Done()
168171
return
169172
}

0 commit comments

Comments
 (0)