diff --git a/client.go b/client.go index 08c9f588873839351415c8e50872e30804dc5914..e406bed0b1780e86eeae5312d4ed8d2a53143815 100644 --- a/client.go +++ b/client.go @@ -506,12 +506,10 @@ func (c *Client) dispatch(codec ServerCodec) { // Spawn the initial read loop. go c.read(codec) - for { select { case <-c.close: return - // Read path: case op := <-c.readOp: if op.batch { diff --git a/service.go b/service.go index c75f313aaeed60da3466a09cb3e5ae50a2ebe33f..d062149d27dc138acda76734d54e3121487ade6a 100644 --- a/service.go +++ b/service.go @@ -19,6 +19,7 @@ package jrpc import ( "context" "reflect" + "runtime" "unicode" ) @@ -93,18 +94,18 @@ func (e *callback) ServeRPC(w ResponseWriter, r *Request) { fullargs = append(fullargs, reflect.ValueOf(r.ctx)) } fullargs = append(fullargs, args...) - // Catch panic while running the callback. - //defer func() { - // if err := recover(); err != nil { - // const size = 64 << 10 - // buf := make([]byte, size) - // buf = buf[:runtime.Stack(buf, false)] - // log.Error().Str("method", r.msg.Method).Interface("err", err).Hex("buf", buf).Msg("crashed") - // // errRes := errors.New("method handler crashed: " + fmt.Sprint(err)) - // w.Send(nil, nil) - // return - // } - //}() + //Catch panic while running the callback. + defer func() { + if err := recover(); err != nil { + const size = 64 << 10 + buf := make([]byte, size) + buf = buf[:runtime.Stack(buf, false)] + //log.Error().Str("method", r.msg.Method).Interface("err", err).Hex("buf", buf).Msg("crashed") + // errRes := errors.New("method handler crashed: " + fmt.Sprint(err)) + w.Send(nil, nil) + return + } + }() // Run the callback. results := e.fn.Call(fullargs) if e.errPos >= 0 && !results[e.errPos].IsNil() {