mirror of
https://github.com/kataras/iris.git
synced 2025-12-22 04:17:03 +00:00
add a new simple, builtin requestid middleware (makes use of the Context.SetID/GetID methods too)
Former-commit-id: d46bce7c1964adada01934aa95daf389c141defc
This commit is contained in:
82
middleware/requestid/requestid.go
Normal file
82
middleware/requestid/requestid.go
Normal file
@@ -0,0 +1,82 @@
|
||||
package requestid
|
||||
|
||||
import (
|
||||
"github.com/kataras/iris/v12/context"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func init() {
|
||||
context.SetHandlerName("iris/middleware/requestid.*", "iris.request.id")
|
||||
}
|
||||
|
||||
const xRequestIDHeaderValue = "X-Request-ID"
|
||||
|
||||
// Generator defines the function which should extract or generate
|
||||
// a Request ID. See `DefaultGenerator` and `New` package-level functions.
|
||||
type Generator func(ctx context.Context) string
|
||||
|
||||
// DefaultGenerator is the default `Generator` that is used
|
||||
// when nil is passed on `New` package-level function.
|
||||
// It extracts the ID from the "X-Request-ID" request header value
|
||||
// or, if missing, it generates a new UUID(v4) and sets the header and context value.
|
||||
//
|
||||
// See `Get` package-level function too.
|
||||
var DefaultGenerator Generator = func(ctx context.Context) string {
|
||||
id := ctx.GetHeader(xRequestIDHeaderValue)
|
||||
|
||||
if id == "" {
|
||||
uid, err := uuid.NewRandom()
|
||||
if err != nil {
|
||||
ctx.StopWithStatus(500)
|
||||
return ""
|
||||
}
|
||||
|
||||
id = uid.String()
|
||||
ctx.Header(xRequestIDHeaderValue, id)
|
||||
}
|
||||
|
||||
return id
|
||||
}
|
||||
|
||||
// New returns a new request id middleware.
|
||||
// It accepts an ID Generator.
|
||||
// The Generator can stop the handlers chain with an error or
|
||||
// return a valid ID (string).
|
||||
// If it's nil then the `DefaultGenerator` will be used instead.
|
||||
func New(gen Generator) context.Handler {
|
||||
if gen == nil {
|
||||
gen = DefaultGenerator
|
||||
}
|
||||
|
||||
return func(ctx context.Context) {
|
||||
if Get(ctx) != "" {
|
||||
ctx.Next()
|
||||
return
|
||||
}
|
||||
|
||||
id := gen(ctx)
|
||||
if ctx.IsStopped() {
|
||||
// ctx.Next checks that
|
||||
// but we don't want to call SetID if generator failed.
|
||||
return
|
||||
}
|
||||
|
||||
ctx.SetID(id)
|
||||
ctx.Next()
|
||||
}
|
||||
}
|
||||
|
||||
// Get returns the Request ID or empty string.
|
||||
//
|
||||
// A shortcut of `context.GetID().(string)`.
|
||||
func Get(ctx context.Context) string {
|
||||
v := ctx.GetID()
|
||||
if v != nil {
|
||||
if id, ok := v.(string); ok {
|
||||
return id
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
Reference in New Issue
Block a user