Adding upstream version 2.52.6.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
a960158181
commit
6d002e9543
441 changed files with 95392 additions and 0 deletions
66
middleware/requestid/config.go
Normal file
66
middleware/requestid/config.go
Normal file
|
@ -0,0 +1,66 @@
|
|||
package requestid
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/utils"
|
||||
)
|
||||
|
||||
// Config defines the config for middleware.
|
||||
type Config struct {
|
||||
// Next defines a function to skip this middleware when returned true.
|
||||
//
|
||||
// Optional. Default: nil
|
||||
Next func(c *fiber.Ctx) bool
|
||||
|
||||
// Header is the header key where to get/set the unique request ID
|
||||
//
|
||||
// Optional. Default: "X-Request-ID"
|
||||
Header string
|
||||
|
||||
// Generator defines a function to generate the unique identifier.
|
||||
//
|
||||
// Optional. Default: utils.UUID
|
||||
Generator func() string
|
||||
|
||||
// ContextKey defines the key used when storing the request ID in
|
||||
// the locals for a specific request.
|
||||
// Should be a private type instead of string, but too many apps probably
|
||||
// rely on this exact value.
|
||||
//
|
||||
// Optional. Default: "requestid"
|
||||
ContextKey interface{}
|
||||
}
|
||||
|
||||
// ConfigDefault is the default config
|
||||
// It uses a fast UUID generator which will expose the number of
|
||||
// requests made to the server. To conceal this value for better
|
||||
// privacy, use the "utils.UUIDv4" generator.
|
||||
var ConfigDefault = Config{
|
||||
Next: nil,
|
||||
Header: fiber.HeaderXRequestID,
|
||||
Generator: utils.UUID,
|
||||
ContextKey: "requestid",
|
||||
}
|
||||
|
||||
// Helper function to set default values
|
||||
func configDefault(config ...Config) Config {
|
||||
// Return default config if nothing provided
|
||||
if len(config) < 1 {
|
||||
return ConfigDefault
|
||||
}
|
||||
|
||||
// Override default config
|
||||
cfg := config[0]
|
||||
|
||||
// Set default values
|
||||
if cfg.Header == "" {
|
||||
cfg.Header = ConfigDefault.Header
|
||||
}
|
||||
if cfg.Generator == nil {
|
||||
cfg.Generator = ConfigDefault.Generator
|
||||
}
|
||||
if cfg.ContextKey == nil {
|
||||
cfg.ContextKey = ConfigDefault.ContextKey
|
||||
}
|
||||
return cfg
|
||||
}
|
33
middleware/requestid/requestid.go
Normal file
33
middleware/requestid/requestid.go
Normal file
|
@ -0,0 +1,33 @@
|
|||
package requestid
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
// New creates a new middleware handler
|
||||
func New(config ...Config) fiber.Handler {
|
||||
// Set default config
|
||||
cfg := configDefault(config...)
|
||||
|
||||
// Return new handler
|
||||
return func(c *fiber.Ctx) error {
|
||||
// Don't execute middleware if Next returns true
|
||||
if cfg.Next != nil && cfg.Next(c) {
|
||||
return c.Next()
|
||||
}
|
||||
// Get id from request, else we generate one
|
||||
rid := c.Get(cfg.Header)
|
||||
if rid == "" {
|
||||
rid = cfg.Generator()
|
||||
}
|
||||
|
||||
// Set new id to response header
|
||||
c.Set(cfg.Header, rid)
|
||||
|
||||
// Add the request ID to locals
|
||||
c.Locals(cfg.ContextKey, rid)
|
||||
|
||||
// Continue stack
|
||||
return c.Next()
|
||||
}
|
||||
}
|
103
middleware/requestid/requestid_test.go
Normal file
103
middleware/requestid/requestid_test.go
Normal file
|
@ -0,0 +1,103 @@
|
|||
package requestid
|
||||
|
||||
import (
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/utils"
|
||||
)
|
||||
|
||||
// go test -run Test_RequestID
|
||||
func Test_RequestID(t *testing.T) {
|
||||
t.Parallel()
|
||||
app := fiber.New()
|
||||
|
||||
app.Use(New())
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
return c.SendString("Hello, World 👋!")
|
||||
})
|
||||
|
||||
resp, err := app.Test(httptest.NewRequest(fiber.MethodGet, "/", nil))
|
||||
utils.AssertEqual(t, nil, err)
|
||||
utils.AssertEqual(t, fiber.StatusOK, resp.StatusCode)
|
||||
|
||||
reqid := resp.Header.Get(fiber.HeaderXRequestID)
|
||||
utils.AssertEqual(t, 36, len(reqid))
|
||||
|
||||
req := httptest.NewRequest(fiber.MethodGet, "/", nil)
|
||||
req.Header.Add(fiber.HeaderXRequestID, reqid)
|
||||
|
||||
resp, err = app.Test(req)
|
||||
utils.AssertEqual(t, nil, err)
|
||||
utils.AssertEqual(t, fiber.StatusOK, resp.StatusCode)
|
||||
utils.AssertEqual(t, reqid, resp.Header.Get(fiber.HeaderXRequestID))
|
||||
}
|
||||
|
||||
// go test -run Test_RequestID_Next
|
||||
func Test_RequestID_Next(t *testing.T) {
|
||||
t.Parallel()
|
||||
app := fiber.New()
|
||||
app.Use(New(Config{
|
||||
Next: func(_ *fiber.Ctx) bool {
|
||||
return true
|
||||
},
|
||||
}))
|
||||
|
||||
resp, err := app.Test(httptest.NewRequest(fiber.MethodGet, "/", nil))
|
||||
utils.AssertEqual(t, nil, err)
|
||||
utils.AssertEqual(t, resp.Header.Get(fiber.HeaderXRequestID), "")
|
||||
utils.AssertEqual(t, fiber.StatusNotFound, resp.StatusCode)
|
||||
}
|
||||
|
||||
// go test -run Test_RequestID_Locals
|
||||
func Test_RequestID_Locals(t *testing.T) {
|
||||
t.Parallel()
|
||||
reqID := "ThisIsARequestId"
|
||||
type ContextKey int
|
||||
const requestContextKey ContextKey = iota
|
||||
|
||||
app := fiber.New()
|
||||
app.Use(New(Config{
|
||||
Generator: func() string {
|
||||
return reqID
|
||||
},
|
||||
ContextKey: requestContextKey,
|
||||
}))
|
||||
|
||||
var ctxVal string
|
||||
|
||||
app.Use(func(c *fiber.Ctx) error {
|
||||
ctxVal = c.Locals(requestContextKey).(string) //nolint:forcetypeassert,errcheck // We always store a string in here
|
||||
return c.Next()
|
||||
})
|
||||
|
||||
_, err := app.Test(httptest.NewRequest(fiber.MethodGet, "/", nil))
|
||||
utils.AssertEqual(t, nil, err)
|
||||
utils.AssertEqual(t, reqID, ctxVal)
|
||||
}
|
||||
|
||||
// go test -run Test_RequestID_DefaultKey
|
||||
func Test_RequestID_DefaultKey(t *testing.T) {
|
||||
t.Parallel()
|
||||
reqID := "ThisIsARequestId"
|
||||
|
||||
app := fiber.New()
|
||||
app.Use(New(Config{
|
||||
Generator: func() string {
|
||||
return reqID
|
||||
},
|
||||
}))
|
||||
|
||||
var ctxVal string
|
||||
|
||||
app.Use(func(c *fiber.Ctx) error {
|
||||
ctxVal = c.Locals("requestid").(string) //nolint:forcetypeassert,errcheck // We always store a string in here
|
||||
return c.Next()
|
||||
})
|
||||
|
||||
_, err := app.Test(httptest.NewRequest(fiber.MethodGet, "/", nil))
|
||||
utils.AssertEqual(t, nil, err)
|
||||
utils.AssertEqual(t, reqID, ctxVal)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue