mirror of
https://github.com/speatzle/nfsense.git
synced 2025-05-11 19:08:20 +00:00
catch panic, improve error log
This commit is contained in:
parent
5e43a48766
commit
bc8ba876e1
1 changed files with 16 additions and 1 deletions
|
@ -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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue