github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/http/fast/middleware/requestid/xid.go (about)

     1  package requestid
     2  
     3  import (
     4  	"github.com/angenalZZZ/gofunc/http/fast"
     5  	"github.com/rs/xid"
     6  )
     7  
     8  const HeaderXRequestID string = "X-Request-ID"
     9  
    10  // Config defines the config for X-Request-ID middleware
    11  type Config struct {
    12  	// Filter defines a function to skip middleware.
    13  	// Optional. Default: nil
    14  	Filter func(*fast.Ctx) bool
    15  	// Generator defines a function to generate an ID.
    16  	// Optional. Default: func() string {
    17  	//   return uuid.New().String()
    18  	// }
    19  	Generator func() string
    20  }
    21  
    22  // New middleware.
    23  // app.Use(requestid.New())
    24  func New(config ...Config) func(*fast.Ctx) {
    25  	// Init config
    26  	var cfg Config
    27  	// SetHeader config if provided
    28  	if len(config) > 0 {
    29  		cfg = config[0]
    30  	}
    31  	// Set config default values
    32  	if cfg.Generator == nil {
    33  		cfg.Generator = func() string {
    34  			return xid.New().String()
    35  		}
    36  	}
    37  	// Return middleware handle
    38  	return func(c *fast.Ctx) {
    39  		// Filter request to skip middleware
    40  		if cfg.Filter != nil && cfg.Filter(c) {
    41  			c.Next()
    42  			return
    43  		}
    44  		// Get value from X-Request-ID
    45  		rid := c.GetHeader(HeaderXRequestID)
    46  		// Create new ID
    47  		if rid == "" {
    48  			rid = cfg.Generator()
    49  			// Set X-Request-ID
    50  			c.SetHeader(HeaderXRequestID, rid)
    51  		}
    52  		c.Next()
    53  	}
    54  }