diff --git a/middleware/expvar/README.md b/middleware/expvar/README.md index 3f0ce389c2..4abe1b5bf8 100644 --- a/middleware/expvar/README.md +++ b/middleware/expvar/README.md @@ -63,3 +63,23 @@ curl 127.0.0.1:3000/debug/vars?r=c "count": 1 } ``` + +## Config + +```go +// 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 +} +``` + +## Default Config + +```go +var ConfigDefault = Config{ + Next: nil, +} +``` \ No newline at end of file diff --git a/middleware/expvar/config.go b/middleware/expvar/config.go new file mode 100644 index 0000000000..6691dc1a3a --- /dev/null +++ b/middleware/expvar/config.go @@ -0,0 +1,32 @@ +package expvar + +import "github.com/gofiber/fiber/v2" + +// 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 +} + +var ConfigDefault = Config{ + Next: nil, +} + +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.Next == nil { + cfg.Next = ConfigDefault.Next + } + + return cfg +} diff --git a/middleware/expvar/expvar.go b/middleware/expvar/expvar.go index e283b28eb0..7576401781 100644 --- a/middleware/expvar/expvar.go +++ b/middleware/expvar/expvar.go @@ -8,9 +8,17 @@ import ( ) // New creates a new middleware handler -func New() fiber.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() + } + path := c.Path() // We are only interested in /debug/vars routes if len(path) < 11 || !strings.HasPrefix(path, "/debug/vars") { diff --git a/middleware/expvar/expvar_test.go b/middleware/expvar/expvar_test.go index 5694d46ef8..c202c2cba0 100644 --- a/middleware/expvar/expvar_test.go +++ b/middleware/expvar/expvar_test.go @@ -81,3 +81,20 @@ func Test_Expvar_Other_Path(t *testing.T) { utils.AssertEqual(t, nil, err) utils.AssertEqual(t, 302, resp.StatusCode) } + +// go test -run Test_Expvar_Next +func Test_Expvar_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, "/debug/vars", nil)) + utils.AssertEqual(t, nil, err) + utils.AssertEqual(t, 404, resp.StatusCode) +} diff --git a/middleware/pprof/README.md b/middleware/pprof/README.md index 7b07ea3eef..5f26643821 100644 --- a/middleware/pprof/README.md +++ b/middleware/pprof/README.md @@ -23,3 +23,23 @@ After you initiate your Fiber app, you can use the following possibilities: // Default middleware app.Use(pprof.New()) ``` + +## Config + +```go +// 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 +} +``` + +## Default Config + +```go +var ConfigDefault = Config{ + Next: nil, +} +``` \ No newline at end of file diff --git a/middleware/pprof/config.go b/middleware/pprof/config.go new file mode 100644 index 0000000000..93f58fc939 --- /dev/null +++ b/middleware/pprof/config.go @@ -0,0 +1,32 @@ +package pprof + +import "github.com/gofiber/fiber/v2" + +// 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 +} + +var ConfigDefault = Config{ + Next: nil, +} + +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.Next == nil { + cfg.Next = ConfigDefault.Next + } + + return cfg +} diff --git a/middleware/pprof/pprof.go b/middleware/pprof/pprof.go index 4d4c4df911..b4c7ba33b3 100644 --- a/middleware/pprof/pprof.go +++ b/middleware/pprof/pprof.go @@ -24,9 +24,17 @@ var ( ) // New creates a new middleware handler -func New() fiber.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() + } + path := c.Path() // We are only interested in /debug/pprof routes if len(path) < 12 || !strings.HasPrefix(path, "/debug/pprof") { diff --git a/middleware/pprof/pprof_test.go b/middleware/pprof/pprof_test.go index 7191db6b8e..5779bb8eb2 100644 --- a/middleware/pprof/pprof_test.go +++ b/middleware/pprof/pprof_test.go @@ -87,3 +87,20 @@ func Test_Pprof_Other(t *testing.T) { utils.AssertEqual(t, nil, err) utils.AssertEqual(t, 302, resp.StatusCode) } + +// go test -run Test_Pprof_Next +func Test_Pprof_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, "/debug/pprof/", nil)) + utils.AssertEqual(t, nil, err) + utils.AssertEqual(t, 404, resp.StatusCode) +}