From 592545ac4685aa28de4d3dcc7d1a16453c338a9c Mon Sep 17 00:00:00 2001 From: Fenny <25108519+Fenny@users.noreply.github.com> Date: Fri, 3 Jul 2020 19:30:34 +0200 Subject: [PATCH 1/6] Allow default values --- ctx.go | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/ctx.go b/ctx.go index 9172cf0f..c141d1ea 100644 --- a/ctx.go +++ b/ctx.go @@ -312,8 +312,12 @@ func (ctx *Ctx) Cookie(cookie *Cookie) { // Cookies is used for getting a cookie value by key // Returned value is only valid within the handler. Do not store any references. // Make copies or use the Immutable setting instead. -func (ctx *Ctx) Cookies(key string) (value string) { - return getString(ctx.Fasthttp.Request.Header.Cookie(key)) +func (ctx *Ctx) Cookies(key string, defaultValue ...string) (value string) { + value = getString(ctx.Fasthttp.Request.Header.Cookie(key)) + if len(defaultValue) > 0 && len(value) == 0 { + return defaultValue[0] + } + return } // Download transfers the file from path as an attachment. @@ -461,8 +465,12 @@ func (ctx *Ctx) Fresh() bool { // Field names are case-insensitive // Returned value is only valid within the handler. Do not store any references. // Make copies or use the Immutable setting instead. -func (ctx *Ctx) Get(key string) (value string) { - return getString(ctx.Fasthttp.Request.Header.Peek(key)) +func (ctx *Ctx) Get(key string, defaultValue ...string) (value string) { + value = getString(ctx.Fasthttp.Request.Header.Peek(key)) + if len(defaultValue) > 0 && len(value) == 0 { + return defaultValue[0] + } + return } // Hostname contains the hostname derived from the Host HTTP header. @@ -629,7 +637,7 @@ func (ctx *Ctx) OriginalURL() string { // Params is used to get the route parameters. // Defaults to empty string "", if the param doesn't exist. -func (ctx *Ctx) Params(key string) string { +func (ctx *Ctx) Params(key string, defaultValue ...string) (value string) { for i := range ctx.route.routeParams { if len(key) != len(ctx.route.routeParams[i]) { continue @@ -637,12 +645,15 @@ func (ctx *Ctx) Params(key string) string { if ctx.route.routeParams[i] == key { // in case values are not here if len(ctx.values) <= i { - return "" + break } return ctx.values[i] } } - return "" + if len(defaultValue) > 0 { + return defaultValue[0] + } + return } // Path returns the path part of the request URL. @@ -687,8 +698,12 @@ func (ctx *Ctx) Protocol() string { // Query returns the query string parameter in the url. // Returned value is only valid within the handler. Do not store any references. // Make copies or use the Immutable setting instead. -func (ctx *Ctx) Query(key string) (value string) { - return getString(ctx.Fasthttp.QueryArgs().Peek(key)) +func (ctx *Ctx) Query(key string, defaultValue ...string) (value string) { + value = getString(ctx.Fasthttp.QueryArgs().Peek(key)) + if len(defaultValue) > 0 && len(value) == 0 { + return defaultValue[0] + } + return } // Range returns a struct containing the type and a slice of ranges. From cdf45da5b16eb58fd5a04f71e5125c69e8522ec5 Mon Sep 17 00:00:00 2001 From: Fenny <25108519+Fenny@users.noreply.github.com> Date: Fri, 3 Jul 2020 19:35:40 +0200 Subject: [PATCH 2/6] Update ctx.go --- ctx.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctx.go b/ctx.go index c141d1ea..db893fb8 100644 --- a/ctx.go +++ b/ctx.go @@ -650,7 +650,7 @@ func (ctx *Ctx) Params(key string, defaultValue ...string) (value string) { return ctx.values[i] } } - if len(defaultValue) > 0 { + if len(defaultValue) > 0 && len(value) == 0 { return defaultValue[0] } return From 5e23557e08d13b32226ab016745744b9032a5c4f Mon Sep 17 00:00:00 2001 From: Fenny <25108519+Fenny@users.noreply.github.com> Date: Sat, 4 Jul 2020 08:30:18 +0200 Subject: [PATCH 3/6] Accept config in Compress --- middleware/compress.go | 2 ++ middleware/compress_test.go | 44 +++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/middleware/compress.go b/middleware/compress.go index 5cb8ec87..5cd1dfdc 100644 --- a/middleware/compress.go +++ b/middleware/compress.go @@ -47,6 +47,8 @@ func Compress(options ...interface{}) fiber.Handler { config.Next = opt case int: config.Level = opt + case CompressConfig: + config = opt default: log.Fatal("Compress: the following option types are allowed: int") } diff --git a/middleware/compress_test.go b/middleware/compress_test.go index 6f8fc6ec..4945c666 100644 --- a/middleware/compress_test.go +++ b/middleware/compress_test.go @@ -31,6 +31,50 @@ func Test_Middleware_Compress(t *testing.T) { os.Remove("../ctx.go.fiber.gz") } +// go test -run Test_Middleware_Compress_Config +func Test_Middleware_Compress_Config(t *testing.T) { + app := fiber.New() + + app.Use(Compress(CompressConfig{ + Level: CompressLevelDefault, + })) + + app.Get("/", func(c *fiber.Ctx) { + c.SendFile("../ctx.go", true) + }) + + req := httptest.NewRequest("GET", "/", nil) + req.Header.Set(fiber.HeaderAcceptEncoding, "gzip") + + resp, err := app.Test(req) + utils.AssertEqual(t, nil, err, "app.Test(req)") + utils.AssertEqual(t, 200, resp.StatusCode, "Status code") + utils.AssertEqual(t, "gzip", resp.Header.Get(fiber.HeaderContentEncoding)) + utils.AssertEqual(t, fiber.MIMETextPlainCharsetUTF8, resp.Header.Get(fiber.HeaderContentType)) + os.Remove("../ctx.go.fiber.gz") +} + +// go test -run Test_Middleware_Compress_Level +func Test_Middleware_Compress_Level(t *testing.T) { + app := fiber.New() + + app.Use(Compress(2)) + + app.Get("/", func(c *fiber.Ctx) { + c.SendFile("../ctx.go", true) + }) + + req := httptest.NewRequest("GET", "/", nil) + req.Header.Set(fiber.HeaderAcceptEncoding, "br") + + resp, err := app.Test(req) + utils.AssertEqual(t, nil, err, "app.Test(req)") + utils.AssertEqual(t, 200, resp.StatusCode, "Status code") + utils.AssertEqual(t, "br", resp.Header.Get(fiber.HeaderContentEncoding)) + utils.AssertEqual(t, fiber.MIMETextPlainCharsetUTF8, resp.Header.Get(fiber.HeaderContentType)) + os.Remove("../ctx.go.fiber.gz") +} + // go test -v -run=^$ -bench=Benchmark_Middleware_Compress -benchmem -count=4 func Benchmark_Middleware_Compress(b *testing.B) { app := fiber.New() From 4dead8d6d3e34ee0d013c74cba5e7b7b10e28009 Mon Sep 17 00:00:00 2001 From: Fenny <25108519+Fenny@users.noreply.github.com> Date: Sat, 4 Jul 2020 08:39:45 +0200 Subject: [PATCH 4/6] Fix typo in RequestID --- app.go | 2 +- middleware/request_id.go | 4 +-- middleware/request_id_test.go | 55 +++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/app.go b/app.go index 6588566e..9fee9ede 100644 --- a/app.go +++ b/app.go @@ -29,7 +29,7 @@ import ( ) // Version of current package -const Version = "1.12.3" +const Version = "1.12.4" // Map is a shortcut for map[string]interface{}, useful for JSON returns type Map map[string]interface{} diff --git a/middleware/request_id.go b/middleware/request_id.go index b962a0c3..c65519cc 100644 --- a/middleware/request_id.go +++ b/middleware/request_id.go @@ -95,10 +95,10 @@ func requestID(config RequestIDConfig) fiber.Handler { rid := ctx.Get(config.Header) // Create new UUID if empty if len(rid) <= 0 { - rid = utils.UUID() + rid = config.Generator() } // Set new id to response header - ctx.Set(fiber.HeaderXRequestID, rid) + ctx.Set(config.Header, rid) // Continue stack ctx.Next() } diff --git a/middleware/request_id_test.go b/middleware/request_id_test.go index 72aa9584..3afb84fe 100644 --- a/middleware/request_id_test.go +++ b/middleware/request_id_test.go @@ -34,6 +34,61 @@ func Test_Middleware_RequestID(t *testing.T) { utils.AssertEqual(t, reqid, resp.Header.Get(fiber.HeaderXRequestID)) } +// go test -run Test_Middleware_RequestID_Header +func Test_Middleware_RequestID_Header(t *testing.T) { + app := fiber.New() + + app.Use(RequestID("X-Test-header")) + + app.Get("/", func(ctx *fiber.Ctx) { + ctx.Send("Hello?") + }) + + resp, err := app.Test(httptest.NewRequest("GET", "/", nil)) + utils.AssertEqual(t, nil, err, "app.Test(req)") + utils.AssertEqual(t, 200, resp.StatusCode, "Status code") + reqid := resp.Header.Get("X-Test-header") + utils.AssertEqual(t, 36, len(reqid)) + + req := httptest.NewRequest("GET", "/", nil) + req.Header.Add("X-Test-header", reqid) + + resp, err = app.Test(req) + utils.AssertEqual(t, nil, err, "app.Test(req)") + utils.AssertEqual(t, 200, resp.StatusCode, "Status code") + utils.AssertEqual(t, reqid, resp.Header.Get("X-Test-header")) +} + +// go test -run Test_Middleware_RequestID_Config +func Test_Middleware_RequestID_Config(t *testing.T) { + app := fiber.New() + + app.Use(RequestID(RequestIDConfig{ + Header: "X-Test-Header", + Generator: func() string { + return "johndoe" + }, + })) + + app.Get("/", func(ctx *fiber.Ctx) { + ctx.Send("Hello?") + }) + + resp, err := app.Test(httptest.NewRequest("GET", "/", nil)) + utils.AssertEqual(t, nil, err, "app.Test(req)") + utils.AssertEqual(t, 200, resp.StatusCode, "Status code") + reqid := resp.Header.Get("X-Test-Header") + utils.AssertEqual(t, "johndoe", reqid) + + req := httptest.NewRequest("GET", "/", nil) + req.Header.Add(fiber.HeaderXRequestID, reqid) + + resp, err = app.Test(req) + utils.AssertEqual(t, nil, err, "app.Test(req)") + utils.AssertEqual(t, 200, resp.StatusCode, "Status code") + utils.AssertEqual(t, reqid, resp.Header.Get("X-Test-Header")) +} + // go test -v -run=^$ -bench=Benchmark_Middleware_RequestID -benchmem -count=4 func Benchmark_Middleware_RequestID(b *testing.B) { From 5e797e9ef0fa68ec81613daa07dd80c0be539957 Mon Sep 17 00:00:00 2001 From: Fenny <25108519+Fenny@users.noreply.github.com> Date: Sat, 4 Jul 2020 08:42:42 +0200 Subject: [PATCH 5/6] Update package names --- middleware/compress.go | 16 ++++++++-------- middleware/filesystem.go | 2 +- middleware/logger.go | 6 +++--- middleware/request_id.go | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/middleware/compress.go b/middleware/compress.go index 264e7f26..7628543e 100644 --- a/middleware/compress.go +++ b/middleware/compress.go @@ -4,8 +4,8 @@ import ( "fmt" "log" - "github.com/gofiber/fiber" - "github.com/valyala/fasthttp" + fiber "github.com/gofiber/fiber" + fasthttp "github.com/valyala/fasthttp" ) // CompressConfig defines the config for Compress middleware. @@ -67,16 +67,16 @@ func CompressWithConfig(config CompressConfig) fiber.Handler { func compress(config CompressConfig) fiber.Handler { // Init middleware settings - var compress fasthttp.RequestHandler + var compressHandler fasthttp.RequestHandler switch config.Level { case -1: // Disabled - compress = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliNoCompression, fasthttp.CompressNoCompression) + compressHandler = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliNoCompression, fasthttp.CompressNoCompression) case 1: // Best speed - compress = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliBestSpeed, fasthttp.CompressBestSpeed) + compressHandler = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliBestSpeed, fasthttp.CompressBestSpeed) case 2: // Best compression - compress = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliBestCompression, fasthttp.CompressBestCompression) + compressHandler = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliBestCompression, fasthttp.CompressBestCompression) default: // Default - compress = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliDefaultCompression, fasthttp.CompressDefaultCompression) + compressHandler = fasthttp.CompressHandlerBrotliLevel(func(c *fasthttp.RequestCtx) {}, fasthttp.CompressBrotliDefaultCompression, fasthttp.CompressDefaultCompression) } // Return handler return func(c *fiber.Ctx) { @@ -88,6 +88,6 @@ func compress(config CompressConfig) fiber.Handler { // Middleware logic... c.Next() // Compress response - compress(c.Fasthttp) + compressHandler(c.Fasthttp) } } diff --git a/middleware/filesystem.go b/middleware/filesystem.go index e6d0c682..372b507b 100644 --- a/middleware/filesystem.go +++ b/middleware/filesystem.go @@ -10,7 +10,7 @@ import ( "sort" "strings" - "github.com/gofiber/fiber" + fiber "github.com/gofiber/fiber" ) // Middleware types diff --git a/middleware/logger.go b/middleware/logger.go index 6e86bdf6..87beb496 100644 --- a/middleware/logger.go +++ b/middleware/logger.go @@ -11,9 +11,9 @@ import ( "sync" "time" - "github.com/gofiber/fiber" - "github.com/gofiber/utils" - "github.com/valyala/bytebufferpool" + fiber "github.com/gofiber/fiber" + utils "github.com/gofiber/utils" + bytebufferpool "github.com/valyala/bytebufferpool" ) // Middleware types diff --git a/middleware/request_id.go b/middleware/request_id.go index c65519cc..58771fa6 100644 --- a/middleware/request_id.go +++ b/middleware/request_id.go @@ -4,8 +4,8 @@ import ( "fmt" "log" - "github.com/gofiber/fiber" - "github.com/gofiber/utils" + fiber "github.com/gofiber/fiber" + utils "github.com/gofiber/utils" ) // Middleware types From be4cd8de1cecf91dd31d1f3896ec7fba4cf58047 Mon Sep 17 00:00:00 2001 From: Fenny <25108519+Fenny@users.noreply.github.com> Date: Sat, 4 Jul 2020 08:43:56 +0200 Subject: [PATCH 6/6] Update compress_test.go --- middleware/compress_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/middleware/compress_test.go b/middleware/compress_test.go index 4945c666..86db3ae3 100644 --- a/middleware/compress_test.go +++ b/middleware/compress_test.go @@ -67,7 +67,7 @@ func Test_Middleware_Compress_Level(t *testing.T) { req := httptest.NewRequest("GET", "/", nil) req.Header.Set(fiber.HeaderAcceptEncoding, "br") - resp, err := app.Test(req) + resp, err := app.Test(req, 3000) utils.AssertEqual(t, nil, err, "app.Test(req)") utils.AssertEqual(t, 200, resp.StatusCode, "Status code") utils.AssertEqual(t, "br", resp.Header.Get(fiber.HeaderContentEncoding))