catch panic, improve error log

This commit is contained in:
Samuel Lorch 2023-03-05 20:52:24 +01:00
parent 5e43a48766
commit bc8ba876e1

View file

@ -7,6 +7,9 @@ import (
"fmt" "fmt"
"io" "io"
"reflect" "reflect"
"runtime/debug"
"golang.org/x/exp/slog"
) )
type Handler struct { type Handler struct {
@ -23,6 +26,11 @@ func NewHandler(maxRequestSize int64) Handler {
} }
func (h *Handler) HandleRequest(ctx context.Context, r io.Reader, w io.Writer) error { func (h *Handler) HandleRequest(ctx context.Context, r io.Reader, w io.Writer) error {
defer func() {
if r := recover(); r != nil {
slog.Error("Recovered Panic Handling JSONRPC Request", fmt.Errorf("%v", r), "stack", debug.Stack())
}
}()
var req request var req request
bufferedRequest := new(bytes.Buffer) bufferedRequest := new(bytes.Buffer)
reqSize, err := bufferedRequest.ReadFrom(io.LimitReader(r, h.maxRequestSize+1)) reqSize, err := bufferedRequest.ReadFrom(io.LimitReader(r, h.maxRequestSize+1))
@ -63,12 +71,19 @@ func (h *Handler) HandleRequest(ctx context.Context, r io.Reader, w io.Writer) e
params[0] = method.subSystem params[0] = method.subSystem
params[1] = reflect.ValueOf(ctx) params[1] = reflect.ValueOf(ctx)
params[2] = reflect.ValueOf(paramPointer).Elem() params[2] = reflect.ValueOf(paramPointer).Elem()
defer func() {
if r := recover(); r != nil {
slog.Error("Recovered Panic Executing API Method", fmt.Errorf("%v", r), "method", req.Method, "id", req.ID, "stack", debug.Stack())
}
}()
res := method.handlerFunc.Call(params) res := method.handlerFunc.Call(params)
result := res[0].Interface() result := res[0].Interface()
if !res[1].IsNil() { if !res[1].IsNil() {
reqerr := res[1].Interface().(error) reqerr := res[1].Interface().(error)
return respondError(w, req.ID, 0, reqerr) slog.Error("API Method", reqerr, "method", req.Method, "id", req.ID)
respondError(w, req.ID, ErrInternalError, reqerr)
} }
respondResult(w, req.ID, result) respondResult(w, req.ID, result)