2023-03-28 18:39:22 +00:00
|
|
|
// Copyright (c) HashiCorp, Inc.
|
|
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
|
2023-01-25 19:13:38 +00:00
|
|
|
package middleware
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/hashicorp/go-hclog"
|
|
|
|
)
|
|
|
|
|
|
|
|
// NewPanicHandler returns a RecoveryHandlerFunc type function
|
|
|
|
// to handle panic in RPC server's handlers.
|
|
|
|
func NewPanicHandler(logger hclog.Logger) RecoveryHandlerFunc {
|
|
|
|
return func(p interface{}) (err error) {
|
|
|
|
// Log the panic and the stack trace of the Goroutine that caused the panic.
|
|
|
|
stacktrace := hclog.Stacktrace()
|
|
|
|
logger.Error("panic serving rpc request",
|
|
|
|
"panic", p,
|
|
|
|
"stack", stacktrace,
|
|
|
|
)
|
|
|
|
|
|
|
|
return fmt.Errorf("rpc: panic serving request")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
type RecoveryHandlerFunc func(p interface{}) (err error)
|