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 }