2026-05-02 13:02:38 +08:00

47 lines
843 B
Go

package middleware
import (
"crypto/rand"
"encoding/hex"
"time"
"github.com/gin-gonic/gin"
)
const (
HeaderRequestID = "X-Request-ID"
ContextRequestID = "requestID"
)
func RequestID() gin.HandlerFunc {
return func(c *gin.Context) {
requestID := c.GetHeader(HeaderRequestID)
if requestID == "" {
requestID = newRequestID()
}
c.Set(ContextRequestID, requestID)
c.Header(HeaderRequestID, requestID)
c.Next()
}
}
func CurrentRequestID(c *gin.Context) string {
value, ok := c.Get(ContextRequestID)
if !ok {
return ""
}
requestID, ok := value.(string)
if !ok {
return ""
}
return requestID
}
func newRequestID() string {
var raw [16]byte
if _, err := rand.Read(raw[:]); err == nil {
return hex.EncodeToString(raw[:])
}
return hex.EncodeToString([]byte(time.Now().Format("20060102150405.000000000")))
}