mirror of
https://github.com/gofiber/fiber.git
synced 2025-02-14 13:46:23 +00:00
fix(middleware/cors): Validation of multiple Origins (#2883)
* fix: allow origins check Refactor CORS origin validation and normalization to trim leading or trailing whitespace in the cfg.AllowOrigins string [list]. URLs with whitespace inside the URL are invalid, so the normalizeOrigin will return false because url.Parse will fail, and the middleware will panic. fixes #2882 * test: AllowOrigins with whitespace * test(middleware/cors): add benchmarks * chore: fix linter errors * test(middleware/cors): use h() instead of app.Test() * test(middleware/cors): add miltiple origins in Test_CORS_AllowOriginScheme * chore: refactor validate and normalize * test(cors/middleware): add more benchmarks (cherry picked from commit d456e7d82ee087d5b2a5df5d4ab35f19c6397aae)
This commit is contained in:
parent
3c08c1b637
commit
4ab8629706
@ -113,23 +113,31 @@ func New(config ...Config) fiber.Handler {
|
|||||||
log.Panic("[CORS] Insecure setup, 'AllowCredentials' is set to true, and 'AllowOrigins' is set to a wildcard.") //nolint:revive // we want to exit the program
|
log.Panic("[CORS] Insecure setup, 'AllowCredentials' is set to true, and 'AllowOrigins' is set to a wildcard.") //nolint:revive // we want to exit the program
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate and normalize static AllowOrigins if not using AllowOriginsFunc
|
// allowOrigins is a slice of strings that contains the allowed origins
|
||||||
if cfg.AllowOriginsFunc == nil && cfg.AllowOrigins != "" && cfg.AllowOrigins != "*" {
|
// defined in the 'AllowOrigins' configuration.
|
||||||
validatedOrigins := []string{}
|
var allowOrigins []string
|
||||||
for _, origin := range strings.Split(cfg.AllowOrigins, ",") {
|
|
||||||
isValid, normalizedOrigin := normalizeOrigin(origin)
|
// Validate and normalize static AllowOrigins
|
||||||
|
if cfg.AllowOrigins != "" && cfg.AllowOrigins != "*" {
|
||||||
|
origins := strings.Split(cfg.AllowOrigins, ",")
|
||||||
|
allowOrigins = make([]string, len(origins))
|
||||||
|
|
||||||
|
for i, origin := range origins {
|
||||||
|
trimmedOrigin := strings.TrimSpace(origin)
|
||||||
|
isValid, normalizedOrigin := normalizeOrigin(trimmedOrigin)
|
||||||
|
|
||||||
if isValid {
|
if isValid {
|
||||||
validatedOrigins = append(validatedOrigins, normalizedOrigin)
|
allowOrigins[i] = normalizedOrigin
|
||||||
} else {
|
} else {
|
||||||
log.Panicf("[CORS] Invalid origin format in configuration: %s", origin) //nolint:revive // we want to exit the program
|
log.Panicf("[CORS] Invalid origin format in configuration: %s", trimmedOrigin) //nolint:revive // we want to exit the program
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cfg.AllowOrigins = strings.Join(validatedOrigins, ",")
|
} else {
|
||||||
|
// If AllowOrigins is set to a wildcard or not set,
|
||||||
|
// set allowOrigins to a slice with a single element
|
||||||
|
allowOrigins = []string{cfg.AllowOrigins}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert string to slice
|
|
||||||
allowOrigins := strings.Split(strings.ReplaceAll(cfg.AllowOrigins, " ", ""), ",")
|
|
||||||
|
|
||||||
// Strip white spaces
|
// Strip white spaces
|
||||||
allowMethods := strings.ReplaceAll(cfg.AllowMethods, " ", "")
|
allowMethods := strings.ReplaceAll(cfg.AllowMethods, " ", "")
|
||||||
allowHeaders := strings.ReplaceAll(cfg.AllowHeaders, " ", "")
|
allowHeaders := strings.ReplaceAll(cfg.AllowHeaders, " ", "")
|
||||||
@ -164,10 +172,8 @@ func New(config ...Config) fiber.Handler {
|
|||||||
// Run AllowOriginsFunc if the logic for
|
// Run AllowOriginsFunc if the logic for
|
||||||
// handling the value in 'AllowOrigins' does
|
// handling the value in 'AllowOrigins' does
|
||||||
// not result in allowOrigin being set.
|
// not result in allowOrigin being set.
|
||||||
if allowOrigin == "" && cfg.AllowOriginsFunc != nil {
|
if allowOrigin == "" && cfg.AllowOriginsFunc != nil && cfg.AllowOriginsFunc(originHeader) {
|
||||||
if cfg.AllowOriginsFunc(originHeader) {
|
allowOrigin = originHeader
|
||||||
allowOrigin = originHeader
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Simple request
|
// Simple request
|
||||||
|
@ -306,6 +306,21 @@ func Test_CORS_AllowOriginScheme(t *testing.T) {
|
|||||||
reqOrigin: "http://ccc.bbb.example.com",
|
reqOrigin: "http://ccc.bbb.example.com",
|
||||||
shouldAllowOrigin: false,
|
shouldAllowOrigin: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
pattern: "http://domain-1.com, http://example.com",
|
||||||
|
reqOrigin: "http://example.com",
|
||||||
|
shouldAllowOrigin: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pattern: "http://domain-1.com, http://example.com",
|
||||||
|
reqOrigin: "http://domain-2.com",
|
||||||
|
shouldAllowOrigin: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pattern: "http://domain-1.com,http://example.com",
|
||||||
|
reqOrigin: "http://domain-1.com",
|
||||||
|
shouldAllowOrigin: true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
@ -451,6 +466,33 @@ func Test_CORS_AllowOriginsAndAllowOriginsFunc_AllUseCases(t *testing.T) {
|
|||||||
RequestOrigin: "http://aaa.com",
|
RequestOrigin: "http://aaa.com",
|
||||||
ResponseOrigin: "http://aaa.com",
|
ResponseOrigin: "http://aaa.com",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "AllowOriginsDefined/AllowOriginsFuncUndefined/MultipleOrigins/NoWhitespace/OriginAllowed",
|
||||||
|
Config: Config{
|
||||||
|
AllowOrigins: "http://aaa.com,http://bbb.com",
|
||||||
|
AllowOriginsFunc: nil,
|
||||||
|
},
|
||||||
|
RequestOrigin: "http://bbb.com",
|
||||||
|
ResponseOrigin: "http://bbb.com",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "AllowOriginsDefined/AllowOriginsFuncUndefined/MultipleOrigins/NoWhitespace/OriginNotAllowed",
|
||||||
|
Config: Config{
|
||||||
|
AllowOrigins: "http://aaa.com,http://bbb.com",
|
||||||
|
AllowOriginsFunc: nil,
|
||||||
|
},
|
||||||
|
RequestOrigin: "http://ccc.com",
|
||||||
|
ResponseOrigin: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "AllowOriginsDefined/AllowOriginsFuncUndefined/MultipleOrigins/Whitespace/OriginAllowed",
|
||||||
|
Config: Config{
|
||||||
|
AllowOrigins: "http://aaa.com, http://bbb.com",
|
||||||
|
AllowOriginsFunc: nil,
|
||||||
|
},
|
||||||
|
RequestOrigin: "http://aaa.com",
|
||||||
|
ResponseOrigin: "http://aaa.com",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "AllowOriginsDefined/AllowOriginsFuncUndefined/OriginNotAllowed",
|
Name: "AllowOriginsDefined/AllowOriginsFuncUndefined/OriginNotAllowed",
|
||||||
Config: Config{
|
Config: Config{
|
||||||
@ -646,3 +688,453 @@ func Test_CORS_AllowCredentials(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// go test -v -run=^$ -bench=Benchmark_CORS_NewHandler -benchmem -count=4
|
||||||
|
func Benchmark_CORS_NewHandler(b *testing.B) {
|
||||||
|
app := fiber.New()
|
||||||
|
c := New(Config{
|
||||||
|
AllowOrigins: "http://localhost,http://example.com",
|
||||||
|
AllowMethods: "GET,POST,PUT,DELETE",
|
||||||
|
AllowHeaders: "Origin,Content-Type,Accept",
|
||||||
|
AllowCredentials: true,
|
||||||
|
MaxAge: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
app.Use(c)
|
||||||
|
app.Use(func(c fiber.Ctx) error {
|
||||||
|
return c.SendStatus(fiber.StatusOK)
|
||||||
|
})
|
||||||
|
|
||||||
|
h := app.Handler()
|
||||||
|
ctx := &fasthttp.RequestCtx{}
|
||||||
|
|
||||||
|
req := &fasthttp.Request{}
|
||||||
|
req.Header.SetMethod(fiber.MethodGet)
|
||||||
|
req.SetRequestURI("/")
|
||||||
|
req.Header.Set(fiber.HeaderOrigin, "http://localhost")
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestMethod, fiber.MethodGet)
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestHeaders, "Origin,Content-Type,Accept")
|
||||||
|
|
||||||
|
ctx.Init(req, nil, nil)
|
||||||
|
|
||||||
|
b.ReportAllocs()
|
||||||
|
b.ResetTimer()
|
||||||
|
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
h(ctx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// go test -v -run=^$ -bench=Benchmark_CORS_NewHandlerParallel -benchmem -count=4
|
||||||
|
func Benchmark_CORS_NewHandlerParallel(b *testing.B) {
|
||||||
|
app := fiber.New()
|
||||||
|
c := New(Config{
|
||||||
|
AllowOrigins: "http://localhost,http://example.com",
|
||||||
|
AllowMethods: "GET,POST,PUT,DELETE",
|
||||||
|
AllowHeaders: "Origin,Content-Type,Accept",
|
||||||
|
AllowCredentials: true,
|
||||||
|
MaxAge: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
app.Use(c)
|
||||||
|
app.Use(func(c fiber.Ctx) error {
|
||||||
|
return c.SendStatus(fiber.StatusOK)
|
||||||
|
})
|
||||||
|
|
||||||
|
h := app.Handler()
|
||||||
|
|
||||||
|
b.ReportAllocs()
|
||||||
|
b.ResetTimer()
|
||||||
|
|
||||||
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
|
ctx := &fasthttp.RequestCtx{}
|
||||||
|
|
||||||
|
req := &fasthttp.Request{}
|
||||||
|
req.Header.SetMethod(fiber.MethodGet)
|
||||||
|
req.SetRequestURI("/")
|
||||||
|
req.Header.Set(fiber.HeaderOrigin, "http://localhost")
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestMethod, fiber.MethodGet)
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestHeaders, "Origin,Content-Type,Accept")
|
||||||
|
|
||||||
|
ctx.Init(req, nil, nil)
|
||||||
|
|
||||||
|
for pb.Next() {
|
||||||
|
h(ctx)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// go test -v -run=^$ -bench=Benchmark_CORS_NewHandlerSingleOrigin -benchmem -count=4
|
||||||
|
func Benchmark_CORS_NewHandlerSingleOrigin(b *testing.B) {
|
||||||
|
app := fiber.New()
|
||||||
|
c := New(Config{
|
||||||
|
AllowOrigins: "http://example.com",
|
||||||
|
AllowMethods: "GET,POST,PUT,DELETE",
|
||||||
|
AllowHeaders: "Origin,Content-Type,Accept",
|
||||||
|
AllowCredentials: true,
|
||||||
|
MaxAge: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
app.Use(c)
|
||||||
|
app.Use(func(c fiber.Ctx) error {
|
||||||
|
return c.SendStatus(fiber.StatusOK)
|
||||||
|
})
|
||||||
|
|
||||||
|
h := app.Handler()
|
||||||
|
ctx := &fasthttp.RequestCtx{}
|
||||||
|
|
||||||
|
req := &fasthttp.Request{}
|
||||||
|
req.Header.SetMethod(fiber.MethodGet)
|
||||||
|
req.SetRequestURI("/")
|
||||||
|
req.Header.Set(fiber.HeaderOrigin, "http://example.com")
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestMethod, fiber.MethodGet)
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestHeaders, "Origin,Content-Type,Accept")
|
||||||
|
|
||||||
|
ctx.Init(req, nil, nil)
|
||||||
|
|
||||||
|
b.ReportAllocs()
|
||||||
|
b.ResetTimer()
|
||||||
|
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
h(ctx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// go test -v -run=^$ -bench=Benchmark_CORS_NewHandlerSingleOriginParallel -benchmem -count=4
|
||||||
|
func Benchmark_CORS_NewHandlerSingleOriginParallel(b *testing.B) {
|
||||||
|
app := fiber.New()
|
||||||
|
c := New(Config{
|
||||||
|
AllowOrigins: "http://example.com",
|
||||||
|
AllowMethods: "GET,POST,PUT,DELETE",
|
||||||
|
AllowHeaders: "Origin,Content-Type,Accept",
|
||||||
|
AllowCredentials: true,
|
||||||
|
MaxAge: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
app.Use(c)
|
||||||
|
app.Use(func(c fiber.Ctx) error {
|
||||||
|
return c.SendStatus(fiber.StatusOK)
|
||||||
|
})
|
||||||
|
|
||||||
|
h := app.Handler()
|
||||||
|
|
||||||
|
b.ReportAllocs()
|
||||||
|
b.ResetTimer()
|
||||||
|
|
||||||
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
|
ctx := &fasthttp.RequestCtx{}
|
||||||
|
|
||||||
|
req := &fasthttp.Request{}
|
||||||
|
req.Header.SetMethod(fiber.MethodGet)
|
||||||
|
req.SetRequestURI("/")
|
||||||
|
req.Header.Set(fiber.HeaderOrigin, "http://example.com")
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestMethod, fiber.MethodGet)
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestHeaders, "Origin,Content-Type,Accept")
|
||||||
|
|
||||||
|
ctx.Init(req, nil, nil)
|
||||||
|
|
||||||
|
for pb.Next() {
|
||||||
|
h(ctx)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// go test -v -run=^$ -bench=Benchmark_CORS_NewHandlerWildcard -benchmem -count=4
|
||||||
|
func Benchmark_CORS_NewHandlerWildcard(b *testing.B) {
|
||||||
|
app := fiber.New()
|
||||||
|
c := New(Config{
|
||||||
|
AllowOrigins: "*",
|
||||||
|
AllowMethods: "GET,POST,PUT,DELETE",
|
||||||
|
AllowHeaders: "Origin,Content-Type,Accept",
|
||||||
|
AllowCredentials: false,
|
||||||
|
MaxAge: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
app.Use(c)
|
||||||
|
app.Use(func(c fiber.Ctx) error {
|
||||||
|
return c.SendStatus(fiber.StatusOK)
|
||||||
|
})
|
||||||
|
|
||||||
|
h := app.Handler()
|
||||||
|
ctx := &fasthttp.RequestCtx{}
|
||||||
|
|
||||||
|
req := &fasthttp.Request{}
|
||||||
|
req.Header.SetMethod(fiber.MethodGet)
|
||||||
|
req.SetRequestURI("/")
|
||||||
|
req.Header.Set(fiber.HeaderOrigin, "http://example.com")
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestMethod, fiber.MethodGet)
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestHeaders, "Origin,Content-Type,Accept")
|
||||||
|
|
||||||
|
ctx.Init(req, nil, nil)
|
||||||
|
|
||||||
|
b.ReportAllocs()
|
||||||
|
b.ResetTimer()
|
||||||
|
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
h(ctx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// go test -v -run=^$ -bench=Benchmark_CORS_NewHandlerWildcardParallel -benchmem -count=4
|
||||||
|
func Benchmark_CORS_NewHandlerWildcardParallel(b *testing.B) {
|
||||||
|
app := fiber.New()
|
||||||
|
c := New(Config{
|
||||||
|
AllowOrigins: "*",
|
||||||
|
AllowMethods: "GET,POST,PUT,DELETE",
|
||||||
|
AllowHeaders: "Origin,Content-Type,Accept",
|
||||||
|
AllowCredentials: false,
|
||||||
|
MaxAge: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
app.Use(c)
|
||||||
|
app.Use(func(c fiber.Ctx) error {
|
||||||
|
return c.SendStatus(fiber.StatusOK)
|
||||||
|
})
|
||||||
|
|
||||||
|
h := app.Handler()
|
||||||
|
|
||||||
|
b.ReportAllocs()
|
||||||
|
b.ResetTimer()
|
||||||
|
|
||||||
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
|
ctx := &fasthttp.RequestCtx{}
|
||||||
|
|
||||||
|
req := &fasthttp.Request{}
|
||||||
|
req.Header.SetMethod(fiber.MethodGet)
|
||||||
|
req.SetRequestURI("/")
|
||||||
|
req.Header.Set(fiber.HeaderOrigin, "http://example.com")
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestMethod, fiber.MethodGet)
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestHeaders, "Origin,Content-Type,Accept")
|
||||||
|
|
||||||
|
ctx.Init(req, nil, nil)
|
||||||
|
|
||||||
|
for pb.Next() {
|
||||||
|
h(ctx)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// go test -v -run=^$ -bench=Benchmark_CORS_NewHandlerPreflight -benchmem -count=4
|
||||||
|
func Benchmark_CORS_NewHandlerPreflight(b *testing.B) {
|
||||||
|
app := fiber.New()
|
||||||
|
c := New(Config{
|
||||||
|
AllowOrigins: "http://localhost,http://example.com",
|
||||||
|
AllowMethods: "GET,POST,PUT,DELETE",
|
||||||
|
AllowHeaders: "Origin,Content-Type,Accept",
|
||||||
|
AllowCredentials: true,
|
||||||
|
MaxAge: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
app.Use(c)
|
||||||
|
app.Use(func(c fiber.Ctx) error {
|
||||||
|
return c.SendStatus(fiber.StatusOK)
|
||||||
|
})
|
||||||
|
|
||||||
|
h := app.Handler()
|
||||||
|
ctx := &fasthttp.RequestCtx{}
|
||||||
|
|
||||||
|
req := &fasthttp.Request{}
|
||||||
|
req.Header.SetMethod(fiber.MethodOptions)
|
||||||
|
req.SetRequestURI("/")
|
||||||
|
req.Header.Set(fiber.HeaderOrigin, "http://example.com")
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestMethod, fiber.MethodPost)
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestHeaders, "Origin,Content-Type,Accept")
|
||||||
|
|
||||||
|
ctx.Init(req, nil, nil)
|
||||||
|
|
||||||
|
b.ReportAllocs()
|
||||||
|
b.ResetTimer()
|
||||||
|
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
h(ctx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// go test -v -run=^$ -bench=Benchmark_CORS_NewHandlerPreflightParallel -benchmem -count=4
|
||||||
|
func Benchmark_CORS_NewHandlerPreflightParallel(b *testing.B) {
|
||||||
|
app := fiber.New()
|
||||||
|
c := New(Config{
|
||||||
|
AllowOrigins: "http://localhost,http://example.com",
|
||||||
|
AllowMethods: "GET,POST,PUT,DELETE",
|
||||||
|
AllowHeaders: "Origin,Content-Type,Accept",
|
||||||
|
AllowCredentials: true,
|
||||||
|
MaxAge: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
app.Use(c)
|
||||||
|
app.Use(func(c fiber.Ctx) error {
|
||||||
|
return c.SendStatus(fiber.StatusOK)
|
||||||
|
})
|
||||||
|
|
||||||
|
h := app.Handler()
|
||||||
|
|
||||||
|
b.ReportAllocs()
|
||||||
|
b.ResetTimer()
|
||||||
|
|
||||||
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
|
ctx := &fasthttp.RequestCtx{}
|
||||||
|
|
||||||
|
req := &fasthttp.Request{}
|
||||||
|
req.Header.SetMethod(fiber.MethodOptions)
|
||||||
|
req.SetRequestURI("/")
|
||||||
|
req.Header.Set(fiber.HeaderOrigin, "http://example.com")
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestMethod, fiber.MethodPost)
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestHeaders, "Origin,Content-Type,Accept")
|
||||||
|
|
||||||
|
ctx.Init(req, nil, nil)
|
||||||
|
|
||||||
|
for pb.Next() {
|
||||||
|
h(ctx)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// go test -v -run=^$ -bench=Benchmark_CORS_NewHandlerPreflightSingleOrigin -benchmem -count=4
|
||||||
|
func Benchmark_CORS_NewHandlerPreflightSingleOrigin(b *testing.B) {
|
||||||
|
app := fiber.New()
|
||||||
|
c := New(Config{
|
||||||
|
AllowOrigins: "http://example.com",
|
||||||
|
AllowMethods: "GET,POST,PUT,DELETE",
|
||||||
|
AllowHeaders: "Origin,Content-Type,Accept",
|
||||||
|
AllowCredentials: true,
|
||||||
|
MaxAge: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
app.Use(c)
|
||||||
|
app.Use(func(c fiber.Ctx) error {
|
||||||
|
return c.SendStatus(fiber.StatusOK)
|
||||||
|
})
|
||||||
|
|
||||||
|
h := app.Handler()
|
||||||
|
ctx := &fasthttp.RequestCtx{}
|
||||||
|
|
||||||
|
req := &fasthttp.Request{}
|
||||||
|
req.Header.SetMethod(fiber.MethodOptions)
|
||||||
|
req.SetRequestURI("/")
|
||||||
|
req.Header.Set(fiber.HeaderOrigin, "http://example.com")
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestMethod, fiber.MethodPost)
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestHeaders, "Origin,Content-Type,Accept")
|
||||||
|
|
||||||
|
ctx.Init(req, nil, nil)
|
||||||
|
|
||||||
|
b.ReportAllocs()
|
||||||
|
b.ResetTimer()
|
||||||
|
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
h(ctx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// go test -v -run=^$ -bench=Benchmark_CORS_NewHandlerPreflightSingleOriginParallel -benchmem -count=4
|
||||||
|
func Benchmark_CORS_NewHandlerPreflightSingleOriginParallel(b *testing.B) {
|
||||||
|
app := fiber.New()
|
||||||
|
c := New(Config{
|
||||||
|
AllowOrigins: "http://example.com",
|
||||||
|
AllowMethods: "GET,POST,PUT,DELETE",
|
||||||
|
AllowHeaders: "Origin,Content-Type,Accept",
|
||||||
|
AllowCredentials: true,
|
||||||
|
MaxAge: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
app.Use(c)
|
||||||
|
app.Use(func(c fiber.Ctx) error {
|
||||||
|
return c.SendStatus(fiber.StatusOK)
|
||||||
|
})
|
||||||
|
|
||||||
|
h := app.Handler()
|
||||||
|
|
||||||
|
b.ReportAllocs()
|
||||||
|
b.ResetTimer()
|
||||||
|
|
||||||
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
|
ctx := &fasthttp.RequestCtx{}
|
||||||
|
|
||||||
|
req := &fasthttp.Request{}
|
||||||
|
req.Header.SetMethod(fiber.MethodOptions)
|
||||||
|
req.SetRequestURI("/")
|
||||||
|
req.Header.Set(fiber.HeaderOrigin, "http://example.com")
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestMethod, fiber.MethodPost)
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestHeaders, "Origin,Content-Type,Accept")
|
||||||
|
|
||||||
|
ctx.Init(req, nil, nil)
|
||||||
|
|
||||||
|
for pb.Next() {
|
||||||
|
h(ctx)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// go test -v -run=^$ -bench=Benchmark_CORS_NewHandlerPreflightWildcard -benchmem -count=4
|
||||||
|
func Benchmark_CORS_NewHandlerPreflightWildcard(b *testing.B) {
|
||||||
|
app := fiber.New()
|
||||||
|
c := New(Config{
|
||||||
|
AllowOrigins: "*",
|
||||||
|
AllowMethods: "GET,POST,PUT,DELETE",
|
||||||
|
AllowHeaders: "Origin,Content-Type,Accept",
|
||||||
|
AllowCredentials: false,
|
||||||
|
MaxAge: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
app.Use(c)
|
||||||
|
app.Use(func(c fiber.Ctx) error {
|
||||||
|
return c.SendStatus(fiber.StatusOK)
|
||||||
|
})
|
||||||
|
|
||||||
|
h := app.Handler()
|
||||||
|
ctx := &fasthttp.RequestCtx{}
|
||||||
|
|
||||||
|
req := &fasthttp.Request{}
|
||||||
|
req.Header.SetMethod(fiber.MethodOptions)
|
||||||
|
req.SetRequestURI("/")
|
||||||
|
req.Header.Set(fiber.HeaderOrigin, "http://example.com")
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestMethod, fiber.MethodPost)
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestHeaders, "Origin,Content-Type,Accept")
|
||||||
|
|
||||||
|
ctx.Init(req, nil, nil)
|
||||||
|
|
||||||
|
b.ReportAllocs()
|
||||||
|
b.ResetTimer()
|
||||||
|
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
h(ctx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// go test -v -run=^$ -bench=Benchmark_CORS_NewHandlerPreflightWildcardParallel -benchmem -count=4
|
||||||
|
func Benchmark_CORS_NewHandlerPreflightWildcardParallel(b *testing.B) {
|
||||||
|
app := fiber.New()
|
||||||
|
c := New(Config{
|
||||||
|
AllowOrigins: "*",
|
||||||
|
AllowMethods: "GET,POST,PUT,DELETE",
|
||||||
|
AllowHeaders: "Origin,Content-Type,Accept",
|
||||||
|
AllowCredentials: false,
|
||||||
|
MaxAge: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
app.Use(c)
|
||||||
|
app.Use(func(c fiber.Ctx) error {
|
||||||
|
return c.SendStatus(fiber.StatusOK)
|
||||||
|
})
|
||||||
|
|
||||||
|
h := app.Handler()
|
||||||
|
|
||||||
|
b.ReportAllocs()
|
||||||
|
b.ResetTimer()
|
||||||
|
|
||||||
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
|
ctx := &fasthttp.RequestCtx{}
|
||||||
|
|
||||||
|
req := &fasthttp.Request{}
|
||||||
|
req.Header.SetMethod(fiber.MethodOptions)
|
||||||
|
req.SetRequestURI("/")
|
||||||
|
req.Header.Set(fiber.HeaderOrigin, "http://example.com")
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestMethod, fiber.MethodPost)
|
||||||
|
req.Header.Set(fiber.HeaderAccessControlRequestHeaders, "Origin,Content-Type,Accept")
|
||||||
|
|
||||||
|
ctx.Init(req, nil, nil)
|
||||||
|
|
||||||
|
for pb.Next() {
|
||||||
|
h(ctx)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user