40 lines
847 B
Go
40 lines
847 B
Go
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
|
|
}
|