| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | 
							- package middleware
 
- import (
 
- 	"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)
 
- 		}
 
- 	}
 
- }
 
 
  |