forgejo-tickets/internal/middleware/middleware.go

47 lines
882 B
Go

package middleware
import (
"crypto/rand"
"encoding/hex"
"net/http"
"github.com/gin-gonic/gin"
"github.com/rs/zerolog/log"
"runtime/debug"
"time"
)
func RequestID(c *gin.Context) {
id := make([]byte, 8)
rand.Read(id)
reqID := hex.EncodeToString(id)
c.Writer.Header().Set("X-Request-ID", reqID)
c.Next()
}
type responseWriter struct {
http.ResponseWriter
status int
}
func (rw *responseWriter) WriteHeader(code int) {
rw.status = code
rw.ResponseWriter.WriteHeader(code)
}
func Logging(c *gin.Context) {
start := time.Now()
c.Next()
log.Info().Msgf("%s %s %d %s", c.Request.Method, c.Request.URL.Path, c.Writer.Status(), time.Since(start))
}
func Recovery(c *gin.Context) {
defer func() {
if err := recover(); err != nil {
log.Error().Msgf("panic: %v\n%s", err, debug.Stack())
c.AbortWithStatus(http.StatusInternalServerError)
}
}()
c.Next()
}