@@ -0,0 +1,39 @@
|
||||
package requestid
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func New(opts ...Option) gin.HandlerFunc {
|
||||
var cfg config = config{
|
||||
generator: DefaultFenerator,
|
||||
}
|
||||
for _, opt := range opts {
|
||||
opt(&cfg)
|
||||
}
|
||||
return func(c *gin.Context) {
|
||||
rid := strings.TrimSpace(c.GetHeader(HeaderKey))
|
||||
clientProvided := rid != "" && len(rid) <= 128
|
||||
if !clientProvided {
|
||||
rid = cfg.generator()
|
||||
}
|
||||
c.Request.Header.Set(HeaderKey, rid)
|
||||
c.Header(HeaderKey, rid)
|
||||
c.Set(ContextKey, rid)
|
||||
c.Set(ClientProvidedContextKey, clientProvided)
|
||||
}
|
||||
}
|
||||
|
||||
// FromClient 仅返回客户端显式提供且长度合规的请求ID。
|
||||
func FromClient(c *gin.Context) (string, bool) {
|
||||
if c == nil {
|
||||
return "", false
|
||||
}
|
||||
provided, ok := c.Get(ClientProvidedContextKey)
|
||||
if !ok || provided != true {
|
||||
return "", false
|
||||
}
|
||||
return c.GetHeader(HeaderKey), true
|
||||
}
|
||||
Reference in New Issue
Block a user