-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
request_id.go
76 lines (68 loc) · 1.78 KB
/
request_id.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package middleware
import (
"github.com/gofiber/fiber"
"github.com/gofiber/utils"
)
// Middleware types
type (
// RequestIDConfig defines the config for Logger middleware.
RequestIDConfig struct {
// Next defines a function to skip this middleware.
Next func(ctx *fiber.Ctx) bool
// Header is the header key where to get/set the unique ID
// Optional. Default: X-Request-ID
Header string
// Generator defines a function to generate the unique identifier.
// Optional. Default: func() string {
// return utils.UUID()
// }
Generator func() string
}
)
// RequestIDConfigDefault is the default config
var RequestIDConfigDefault = RequestIDConfig{
Next: nil,
Header: fiber.HeaderXRequestID,
Generator: func() string {
return utils.UUID()
},
}
// RequestID adds an UUID indentifier to the request
func RequestID(header ...string) fiber.Handler {
// Create default config
var config = RequestIDConfigDefault
// Set lookup if provided
if len(header) > 0 {
config.Header = header[0]
}
// Return LoggerWithConfig
return RequestIDWithConfig(config)
}
// RequestIDWithConfig allows you to pass a custom config
func RequestIDWithConfig(config RequestIDConfig) fiber.Handler {
// Set default values
if config.Header == "" {
config.Header = RequestIDConfigDefault.Header
}
if config.Generator == nil {
config.Generator = RequestIDConfigDefault.Generator
}
// Return handler
return func(ctx *fiber.Ctx) {
// Don't execute the middleware if Next returns true
if config.Next != nil && config.Next(ctx) {
ctx.Next()
return
}
// Get id from request
rid := ctx.Get(config.Header)
// Create new UUID if empty
if len(rid) <= 0 {
rid = utils.UUID()
}
// Set new id to response header
ctx.Set(fiber.HeaderXRequestID, rid)
// Continue stack
ctx.Next()
}
}