mirror of https://github.com/gofiber/fiber.git
506 lines
11 KiB
Go
506 lines
11 KiB
Go
// ⚡️ Fiber is an Express inspired web framework written in Go with ☕️
|
|
// 🤖 Github Repository: https://github.com/gofiber/fiber
|
|
// 📌 API Documentation: https://docs.gofiber.io
|
|
|
|
package fiber
|
|
|
|
import (
|
|
"bytes"
|
|
"mime/multipart"
|
|
"strconv"
|
|
"testing"
|
|
|
|
"github.com/valyala/fasthttp"
|
|
)
|
|
|
|
// go test -v ./... -run=^$ -bench=Benchmark_Ctx_Params -benchmem -count=3
|
|
|
|
func Benchmark_Ctx_Accepts(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
c.Fasthttp.Request.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9")
|
|
|
|
var res string
|
|
for n := 0; n < b.N; n++ {
|
|
res = c.Accepts(".xml")
|
|
}
|
|
|
|
assertEqual(b, ".xml", res)
|
|
}
|
|
|
|
func Benchmark_Ctx_AcceptsCharsets(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
c.Fasthttp.Request.Header.Set("Accept-Charset", "utf-8, iso-8859-1;q=0.5")
|
|
|
|
var res string
|
|
for n := 0; n < b.N; n++ {
|
|
res = c.AcceptsCharsets("utf-8")
|
|
}
|
|
|
|
assertEqual(b, "utf-8", res)
|
|
}
|
|
|
|
func Benchmark_Ctx_AcceptsEncodings(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
c.Fasthttp.Request.Header.Set("Accept-Encoding", "deflate, gzip;q=1.0, *;q=0.5")
|
|
|
|
var res string
|
|
for n := 0; n < b.N; n++ {
|
|
res = c.AcceptsEncodings("gzip")
|
|
}
|
|
|
|
assertEqual(b, "gzip", res)
|
|
}
|
|
|
|
func Benchmark_Ctx_AcceptsLanguages(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
c.Fasthttp.Request.Header.Set("Accept-Language", "fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5")
|
|
|
|
var res string
|
|
for n := 0; n < b.N; n++ {
|
|
res = c.AcceptsLanguages("fr")
|
|
}
|
|
|
|
assertEqual(b, "fr", res)
|
|
}
|
|
|
|
func Benchmark_Ctx_BaseURL(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
c.Fasthttp.Request.SetHost("google.com:1337")
|
|
|
|
var res string
|
|
for n := 0; n < b.N; n++ {
|
|
res = c.BaseURL()
|
|
}
|
|
|
|
assertEqual(b, "http://google.com:1337", res)
|
|
}
|
|
|
|
func Benchmark_Ctx_Body(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
c.Fasthttp.Request.SetBody([]byte("The best thing about a boolean is even if you are wrong, you are only off by a bit."))
|
|
|
|
var res string
|
|
for n := 0; n < b.N; n++ {
|
|
res = c.Body()
|
|
}
|
|
|
|
assertEqual(b, "The best thing about a boolean is even if you are wrong, you are only off by a bit.", res)
|
|
}
|
|
|
|
// TODO
|
|
// func Benchmark_Ctx_BodyParser(b *testing.B) {
|
|
|
|
// }
|
|
|
|
func Benchmark_Ctx_Cookies(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
c.Fasthttp.Request.Header.Set("Cookie", "john=doe")
|
|
|
|
var res string
|
|
for n := 0; n < b.N; n++ {
|
|
res = c.Cookies("john")
|
|
}
|
|
|
|
assertEqual(b, "doe", res)
|
|
}
|
|
|
|
func Benchmark_Ctx_FormFile(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
body := &bytes.Buffer{}
|
|
writer := multipart.NewWriter(body)
|
|
ioWriter, _ := writer.CreateFormFile("file", "test")
|
|
_, _ = ioWriter.Write([]byte("hello world"))
|
|
writer.Close()
|
|
|
|
c.Fasthttp.Request.Header.SetMethod("POST")
|
|
c.Fasthttp.Request.Header.Set("Content-Type", writer.FormDataContentType())
|
|
c.Fasthttp.Request.Header.Set("Content-Length", strconv.Itoa(len(body.Bytes())))
|
|
c.Fasthttp.Request.SetBody(body.Bytes())
|
|
|
|
var res *multipart.FileHeader
|
|
for n := 0; n < b.N; n++ {
|
|
res, _ = c.FormFile("file")
|
|
}
|
|
|
|
assertEqual(b, "test", res.Filename)
|
|
assertEqual(b, "application/octet-stream", res.Header["Content-Type"][0])
|
|
assertEqual(b, int64(11), res.Size)
|
|
}
|
|
|
|
// func Benchmark_Ctx_FormValue(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_Fresh(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_Get(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_Hostname(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_IP(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_IPs(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_Is(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_Locals(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_Method(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_MultipartForm(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_OriginalURL(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
func Benchmark_Ctx_Params(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
c.route = &Route{
|
|
Params: []string{
|
|
"param1", "param2", "param3", "param4",
|
|
},
|
|
}
|
|
c.values = []string{
|
|
"john", "doe", "is", "awesome",
|
|
}
|
|
|
|
var res string
|
|
for n := 0; n < b.N; n++ {
|
|
_ = c.Params("param1")
|
|
_ = c.Params("param2")
|
|
_ = c.Params("param3")
|
|
res = c.Params("param4")
|
|
}
|
|
|
|
assertEqual(b, "awesome", res)
|
|
}
|
|
|
|
// func Benchmark_Ctx_Path(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_Query(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_Range(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_Route(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_SaveFile(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_Secure(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_Stale(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
func Benchmark_Ctx_Subdomains(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
c.Fasthttp.Request.SetRequestURI("http://john.doe.google.com")
|
|
|
|
var res []string
|
|
for n := 0; n < b.N; n++ {
|
|
res = c.Subdomains()
|
|
}
|
|
|
|
assertEqual(b, []string{"john", "doe"}, res)
|
|
}
|
|
|
|
func Benchmark_Ctx_Append(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
c.Append("X-Custom-Header", "Hello")
|
|
c.Append("X-Custom-Header", "World")
|
|
c.Append("X-Custom-Header", "Hello")
|
|
}
|
|
|
|
assertEqual(b, "Hello, World", getString(c.Fasthttp.Response.Header.Peek("X-Custom-Header")))
|
|
}
|
|
|
|
// func Benchmark_Ctx_Attachment(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
// func Benchmark_Ctx_ClearCookie(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
func Benchmark_Ctx_Cookie(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
c.Cookie(&Cookie{
|
|
Name: "John",
|
|
Value: "Doe",
|
|
})
|
|
}
|
|
|
|
assertEqual(b, "John=Doe; path=/", getString(c.Fasthttp.Response.Header.Peek("Set-Cookie")))
|
|
}
|
|
|
|
// func Benchmark_Ctx_Download(b *testing.B) {
|
|
// TODO
|
|
// }
|
|
|
|
func Benchmark_Ctx_Format(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
c.Fasthttp.Request.Header.Set("Accept", "text/html")
|
|
for n := 0; n < b.N; n++ {
|
|
c.Format("Hello, World!")
|
|
}
|
|
assertEqual(b, "<p>Hello, World!</p>", string(c.Fasthttp.Response.Body()))
|
|
|
|
c.Fasthttp.Request.Header.Set("Accept", "application/json")
|
|
for n := 0; n < b.N; n++ {
|
|
c.Format("Hello, World!")
|
|
}
|
|
assertEqual(b, `"Hello, World!"`, string(c.Fasthttp.Response.Body()))
|
|
|
|
c.Fasthttp.Request.Header.Set("Accept", "text/plain")
|
|
for n := 0; n < b.N; n++ {
|
|
c.Format("Hello, World!")
|
|
}
|
|
assertEqual(b, `Hello, World!`, string(c.Fasthttp.Response.Body()))
|
|
|
|
c.Fasthttp.Request.Header.Set("Accept", "application/xml")
|
|
for n := 0; n < b.N; n++ {
|
|
c.Format("Hello, World!")
|
|
}
|
|
assertEqual(b, `<string>Hello, World!</string>`, string(c.Fasthttp.Response.Body()))
|
|
}
|
|
|
|
func Benchmark_Ctx_JSON(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
type SomeStruct struct {
|
|
Name string
|
|
Age uint8
|
|
}
|
|
|
|
data := SomeStruct{
|
|
Name: "Grame",
|
|
Age: 20,
|
|
}
|
|
var err error
|
|
for n := 0; n < b.N; n++ {
|
|
err = c.JSON(data)
|
|
}
|
|
assertEqual(b, nil, err)
|
|
assertEqual(b, `{"Name":"Grame","Age":20}`, string(c.Fasthttp.Response.Body()))
|
|
}
|
|
|
|
func Benchmark_Ctx_JSONP(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
type SomeStruct struct {
|
|
Name string
|
|
Age uint8
|
|
}
|
|
|
|
data := SomeStruct{
|
|
Name: "Grame",
|
|
Age: 20,
|
|
}
|
|
var err error
|
|
for n := 0; n < b.N; n++ {
|
|
err = c.JSONP(data, "john")
|
|
}
|
|
|
|
assertEqual(b, nil, err)
|
|
assertEqual(b, `john({"Name":"Grame","Age":20});`, string(c.Fasthttp.Response.Body()))
|
|
}
|
|
|
|
func Benchmark_Ctx_Links(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
c.Links(
|
|
"http://api.example.com/users?page=2", "next",
|
|
"http://api.example.com/users?page=5", "last",
|
|
)
|
|
}
|
|
assertEqual(b, `<http://api.example.com/users?page=2>; rel="next",<http://api.example.com/users?page=5>; rel="last"`, string(c.Fasthttp.Response.Header.Peek("Link")))
|
|
}
|
|
|
|
// TODO
|
|
// func Benchmark_Ctx_Next(b *testing.B) {
|
|
|
|
// }
|
|
|
|
func Benchmark_Ctx_Redirect(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
c.Redirect("http://example.com")
|
|
c.Redirect("http://example.com", 301)
|
|
}
|
|
assertEqual(b, 301, c.Fasthttp.Response.StatusCode())
|
|
assertEqual(b, "http://example.com", string(c.Fasthttp.Response.Header.Peek("Location")))
|
|
}
|
|
|
|
// TODO
|
|
// func Benchmark_Ctx_Render(b *testing.B) {
|
|
|
|
// }
|
|
|
|
func Benchmark_Ctx_Send(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
c.Send([]byte("Hello, World"), "Hello, World!", "Hello, World!")
|
|
c.Send("Hello, World", 50, 30, 20)
|
|
c.Send(1337)
|
|
}
|
|
assertEqual(b, "1337", string(c.Fasthttp.Response.Body()))
|
|
}
|
|
|
|
func Benchmark_Ctx_SendBytes(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
c.SendBytes([]byte("Hello, World"))
|
|
}
|
|
assertEqual(b, "Hello, World", string(c.Fasthttp.Response.Body()))
|
|
}
|
|
|
|
func Benchmark_Ctx_SendStatus(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
c.SendStatus(415)
|
|
}
|
|
assertEqual(b, 415, c.Fasthttp.Response.StatusCode())
|
|
assertEqual(b, "Unsupported Media Type", string(c.Fasthttp.Response.Body()))
|
|
}
|
|
|
|
func Benchmark_Ctx_SendString(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
c.Send("Hello, World")
|
|
}
|
|
assertEqual(b, "Hello, World", string(c.Fasthttp.Response.Body()))
|
|
}
|
|
|
|
func Benchmark_Ctx_Set(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
c.Set("X-I'm-a-Dummy-HeAdEr", "1337")
|
|
}
|
|
|
|
assertEqual(b, "1337", string(c.Fasthttp.Response.Header.Peek("X-I'm-a-Dummy-HeAdEr")))
|
|
}
|
|
|
|
func Benchmark_Ctx_Type(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
c.Type(".json")
|
|
c.Type("json")
|
|
}
|
|
|
|
assertEqual(b, "application/json", string(c.Fasthttp.Response.Header.Peek("Content-Type")))
|
|
}
|
|
|
|
func Benchmark_Ctx_Vary(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
c.Vary("Origin")
|
|
}
|
|
|
|
//assertEqual(b, "origin", string(c.Fasthttp.Response.Header.Peek("Vary")))
|
|
}
|
|
|
|
func Benchmark_Ctx_Write(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
for n := 0; n < b.N; n++ {
|
|
c.Write("Hello, ")
|
|
c.Write([]byte("World! "))
|
|
c.Write(123)
|
|
}
|
|
c.Send("") // empty body
|
|
c.Write("Hello, World!")
|
|
assertEqual(b, "Hello, World!", string(c.Fasthttp.Response.Body()))
|
|
}
|
|
|
|
func Benchmark_Ctx_XHR(b *testing.B) {
|
|
c := AcquireCtx(&fasthttp.RequestCtx{})
|
|
defer ReleaseCtx(c)
|
|
|
|
c.Fasthttp.Request.Header.Set("X-Requested-With", "xMlHtTpReQuEst")
|
|
|
|
var res bool
|
|
for n := 0; n < b.N; n++ {
|
|
res = c.XHR()
|
|
}
|
|
|
|
assertEqual(b, true, res)
|
|
}
|