mirror of
https://github.com/gofiber/fiber.git
synced 2025-02-24 08:23:43 +00:00
commit
0ebec5b688
2
app.go
2
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{}
|
||||
|
33
ctx.go
33
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 && len(value) == 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.
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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, 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))
|
||||
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()
|
||||
|
@ -10,7 +10,7 @@ import (
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/gofiber/fiber"
|
||||
fiber "github.com/gofiber/fiber"
|
||||
)
|
||||
|
||||
// Middleware types
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
@ -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()
|
||||
}
|
||||
|
@ -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) {
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user