github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/middlewares/recover.go (about)

     1  package middlewares
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"runtime"
     7  
     8  	"github.com/ngocphuongnb/tetua/app/logger"
     9  	"github.com/ngocphuongnb/tetua/app/server"
    10  )
    11  
    12  func Recover(c server.Context) error {
    13  	defer func() {
    14  		if r := recover(); r != nil {
    15  			err, ok := r.(error)
    16  			if !ok {
    17  				err = fmt.Errorf("%v", r)
    18  			}
    19  			stack := make([]byte, 4<<10)
    20  			length := runtime.Stack(stack, true)
    21  			msg := fmt.Sprintf("%v %s\n", err, stack[:length])
    22  			c.Logger().Error(msg, logger.Context{"recovered": true})
    23  			if err := c.Status(http.StatusBadRequest).Json(map[string]string{"error": err.Error()}); err != nil {
    24  				c.Logger().Error(err)
    25  			}
    26  		}
    27  	}()
    28  
    29  	return c.Next()
    30  }