From 76b0d216c196d246d776d01fd1e710ddc79e586e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Efe=20=C3=87etin?= <45270788+efectn@users.noreply.github.com> Date: Mon, 13 Sep 2021 09:51:44 +0300 Subject: [PATCH] Add next support for Monitor middleware. (#1527) --- middleware/monitor/README.md | 20 +++++++++++++++++++ middleware/monitor/config.go | 32 ++++++++++++++++++++++++++++++ middleware/monitor/monitor.go | 11 +++++++++- middleware/monitor/monitor_test.go | 17 ++++++++++++++++ 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 middleware/monitor/config.go diff --git a/middleware/monitor/README.md b/middleware/monitor/README.md index 1ac0a33e..cc551aba 100644 --- a/middleware/monitor/README.md +++ b/middleware/monitor/README.md @@ -30,3 +30,23 @@ func main() { log.Fatal(app.Listen(":3000")) } ``` + +## 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/monitor/config.go b/middleware/monitor/config.go new file mode 100644 index 00000000..584284d9 --- /dev/null +++ b/middleware/monitor/config.go @@ -0,0 +1,32 @@ +package monitor + +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/monitor/monitor.go b/middleware/monitor/monitor.go index e62d6748..727ef4e9 100644 --- a/middleware/monitor/monitor.go +++ b/middleware/monitor/monitor.go @@ -48,7 +48,10 @@ var ( ) // New creates a new middleware handler -func New() fiber.Handler { +func New(config ...Config) fiber.Handler { + // Set default config + cfg := configDefault(config...) + // Start routine to update statistics once.Do(func() { p, _ := process.NewProcess(int32(os.Getpid())) @@ -66,6 +69,11 @@ func New() fiber.Handler { // 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() + } + if c.Method() != fiber.MethodGet { return fiber.ErrMethodNotAllowed } @@ -87,6 +95,7 @@ func New() fiber.Handler { } } + func updateStatistics(p *process.Process) { pidCpu, _ := p.CPUPercent() monitPidCpu.Store(pidCpu / 10) diff --git a/middleware/monitor/monitor_test.go b/middleware/monitor/monitor_test.go index e50dacdb..a49a7efc 100644 --- a/middleware/monitor/monitor_test.go +++ b/middleware/monitor/monitor_test.go @@ -88,3 +88,20 @@ func Benchmark_Monitor(b *testing.B) { fiber.MIMEApplicationJSON, string(fctx.Response.Header.Peek(fiber.HeaderContentType))) } + +// go test -run Test_Monitor_Next +func Test_Monitor_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.MethodPost, "/", nil)) + utils.AssertEqual(t, nil, err) + utils.AssertEqual(t, 404, resp.StatusCode) +}