github.com/gofiber/fiber/v2@v2.47.0/middleware/recover/recover.go (about)

     1  package recover //nolint:predeclared // TODO: Rename to some non-builtin
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"runtime/debug"
     7  
     8  	"github.com/gofiber/fiber/v2"
     9  )
    10  
    11  func defaultStackTraceHandler(_ *fiber.Ctx, e interface{}) {
    12  	_, _ = os.Stderr.WriteString(fmt.Sprintf("panic: %v\n%s\n", e, debug.Stack())) //nolint:errcheck // This will never fail
    13  }
    14  
    15  // New creates a new middleware handler
    16  func New(config ...Config) fiber.Handler {
    17  	// Set default config
    18  	cfg := configDefault(config...)
    19  
    20  	// Return new handler
    21  	return func(c *fiber.Ctx) (err error) { //nolint:nonamedreturns // Uses recover() to overwrite the error
    22  		// Don't execute middleware if Next returns true
    23  		if cfg.Next != nil && cfg.Next(c) {
    24  			return c.Next()
    25  		}
    26  
    27  		// Catch panics
    28  		defer func() {
    29  			if r := recover(); r != nil {
    30  				if cfg.EnableStackTrace {
    31  					cfg.StackTraceHandler(c, r)
    32  				}
    33  
    34  				var ok bool
    35  				if err, ok = r.(error); !ok {
    36  					// Set error that will call the global error handler
    37  					err = fmt.Errorf("%v", r)
    38  				}
    39  			}
    40  		}()
    41  
    42  		// Return err if exist, else move to next handler
    43  		return c.Next()
    44  	}
    45  }