2023-10-17 17:21:53 +08:00
|
|
|
//
|
|
|
|
// reqid.go
|
|
|
|
// Copyright (C) 2023 tiglog <me@tiglog.com>
|
|
|
|
//
|
|
|
|
// Distributed under terms of the MIT license.
|
|
|
|
//
|
|
|
|
|
|
|
|
package requestid
|
|
|
|
|
|
|
|
import (
|
2023-10-17 18:01:33 +08:00
|
|
|
"github.com/gin-gonic/gin"
|
2023-10-17 17:21:53 +08:00
|
|
|
"github.com/rs/xid"
|
|
|
|
)
|
|
|
|
|
|
|
|
var headerXRequestID string
|
|
|
|
|
|
|
|
// Config defines the config for RequestID middleware
|
|
|
|
type config struct {
|
|
|
|
// Generator defines a function to generate an ID.
|
|
|
|
// Optional. Default: func() string {
|
|
|
|
// return xid.New().String()
|
|
|
|
// }
|
|
|
|
generator Generator
|
|
|
|
headerKey HeaderStrKey
|
|
|
|
handler Handler
|
|
|
|
}
|
|
|
|
|
|
|
|
// New initializes the RequestID middleware.
|
2023-10-17 18:01:33 +08:00
|
|
|
func New(opts ...Option) gin.HandlerFunc {
|
2023-10-17 17:21:53 +08:00
|
|
|
cfg := &config{
|
|
|
|
generator: func() string {
|
|
|
|
return xid.New().String()
|
|
|
|
},
|
|
|
|
headerKey: "X-Request-ID",
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, opt := range opts {
|
|
|
|
opt(cfg)
|
|
|
|
}
|
|
|
|
|
|
|
|
headerXRequestID = string(cfg.headerKey)
|
|
|
|
|
2023-10-17 18:01:33 +08:00
|
|
|
return func(c *gin.Context) {
|
2023-10-17 17:21:53 +08:00
|
|
|
// Get id from request
|
|
|
|
rid := c.GetHeader(headerXRequestID)
|
|
|
|
if rid == "" {
|
|
|
|
rid = cfg.generator()
|
|
|
|
c.Request.Header.Add(headerXRequestID, rid)
|
|
|
|
}
|
|
|
|
if cfg.handler != nil {
|
|
|
|
cfg.handler(c, rid)
|
|
|
|
}
|
|
|
|
// Set the id to ensure that the requestid is in the response
|
|
|
|
c.Header(headerXRequestID, rid)
|
|
|
|
c.Next()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get returns the request identifier
|
2023-10-17 18:01:33 +08:00
|
|
|
func Get(c *gin.Context) string {
|
2023-10-17 17:21:53 +08:00
|
|
|
return c.GetHeader(headerXRequestID)
|
|
|
|
}
|