diff --git a/middleware/skip/README.md b/middleware/skip/README.md new file mode 100644 index 00000000..9d5e832d --- /dev/null +++ b/middleware/skip/README.md @@ -0,0 +1,26 @@ +# Skip +Skip middleware for [Fiber](https://github.com/gofiber/fiber) that skips a wrapped handler is a predicate is true. + +### Table of Contents +- [Signatures](#signatures) +- [Examples](#examples) + + +### Signatures +```go +func New(handler fiber.Handler, exclude func(c *fiber.Ctx) bool) fiber.Handler +``` + +### Examples +Import the middleware package that is part of the Fiber web framework +```go +import ( + "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/skip" +) +``` + +After you initiate your Fiber app, you can use the following possibilities: +```go +app.Use(skip.New(handler), func(ctx *fiber.Ctx) bool { return ctx.Method() == fiber.MethodOptions }) +``` diff --git a/middleware/skip/skip.go b/middleware/skip/skip.go new file mode 100644 index 00000000..616baf2d --- /dev/null +++ b/middleware/skip/skip.go @@ -0,0 +1,19 @@ +package skip + +import "github.com/gofiber/fiber/v2" + +// New creates a middleware handler which skips the wrapped handler +// if the exclude predicate returns true. +func New(handler fiber.Handler, exclude func(c *fiber.Ctx) bool) fiber.Handler { + if exclude == nil { + return handler + } + + return func(c *fiber.Ctx) error { + if exclude(c) { + return c.Next() + } + + return handler(c) + } +} diff --git a/middleware/skip/skip_test.go b/middleware/skip/skip_test.go new file mode 100644 index 00000000..7a334872 --- /dev/null +++ b/middleware/skip/skip_test.go @@ -0,0 +1,54 @@ +package skip_test + +import ( + "net/http/httptest" + "testing" + + "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/skip" + "github.com/gofiber/fiber/v2/utils" +) + +// go test -run Test_Skip +func Test_Skip(t *testing.T) { + app := fiber.New() + + app.Use(skip.New(errTeapotHandler, func(*fiber.Ctx) bool { return true })) + app.Get("/", helloWorldHandler) + + resp, err := app.Test(httptest.NewRequest("GET", "/", nil)) + utils.AssertEqual(t, nil, err) + utils.AssertEqual(t, fiber.StatusOK, resp.StatusCode) +} + +// go test -run Test_SkipFalse +func Test_SkipFalse(t *testing.T) { + app := fiber.New() + + app.Use(skip.New(errTeapotHandler, func(*fiber.Ctx) bool { return false })) + app.Get("/", helloWorldHandler) + + resp, err := app.Test(httptest.NewRequest("GET", "/", nil)) + utils.AssertEqual(t, nil, err) + utils.AssertEqual(t, fiber.StatusTeapot, resp.StatusCode) +} + +// go test -run Test_SkipNilFunc +func Test_SkipNilFunc(t *testing.T) { + app := fiber.New() + + app.Use(skip.New(errTeapotHandler, nil)) + app.Get("/", helloWorldHandler) + + resp, err := app.Test(httptest.NewRequest("GET", "/", nil)) + utils.AssertEqual(t, nil, err) + utils.AssertEqual(t, fiber.StatusTeapot, resp.StatusCode) +} + +func helloWorldHandler(c *fiber.Ctx) error { + return c.SendString("Hello, World 👋!") +} + +func errTeapotHandler(*fiber.Ctx) error { + return fiber.ErrTeapot +}