| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | package middlewareimport (	"fmt"	"runtime"	"github.com/labstack/echo")type (	// RecoverConfig defines the config for Recover middleware.	RecoverConfig struct {		// Skipper defines a function to skip middleware.		Skipper Skipper		// Size of the stack to be printed.		// Optional. Default value 4KB.		StackSize int `yaml:"stack_size"`		// DisableStackAll disables formatting stack traces of all other goroutines		// into buffer after the trace for the current goroutine.		// Optional. Default value false.		DisableStackAll bool `yaml:"disable_stack_all"`		// DisablePrintStack disables printing stack trace.		// Optional. Default value as false.		DisablePrintStack bool `yaml:"disable_print_stack"`	})var (	// DefaultRecoverConfig is the default Recover middleware config.	DefaultRecoverConfig = RecoverConfig{		Skipper:           DefaultSkipper,		StackSize:         4 << 10, // 4 KB		DisableStackAll:   false,		DisablePrintStack: false,	})// Recover returns a middleware which recovers from panics anywhere in the chain// and handles the control to the centralized HTTPErrorHandler.func Recover() echo.MiddlewareFunc {	return RecoverWithConfig(DefaultRecoverConfig)}// RecoverWithConfig returns a Recover middleware with config.// See: `Recover()`.func RecoverWithConfig(config RecoverConfig) echo.MiddlewareFunc {	// Defaults	if config.Skipper == nil {		config.Skipper = DefaultRecoverConfig.Skipper	}	if config.StackSize == 0 {		config.StackSize = DefaultRecoverConfig.StackSize	}	return func(next echo.HandlerFunc) echo.HandlerFunc {		return func(c echo.Context) error {			if config.Skipper(c) {				return next(c)			}			defer func() {				if r := recover(); r != nil {					err, ok := r.(error)					if !ok {						err = fmt.Errorf("%v", r)					}					stack := make([]byte, config.StackSize)					length := runtime.Stack(stack, !config.DisableStackAll)					if !config.DisablePrintStack {						c.Logger().Printf("[PANIC RECOVER] %v %s\n", err, stack[:length])					}					c.Error(err)				}			}()			return next(c)		}	}}
 |