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 := 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().UTC().Format("20060102150405.000000000"))) }