mirror of https://github.com/gofiber/fiber.git
Bump v1.2.2
parent
c195450790
commit
29091a54b4
|
@ -13,7 +13,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Version = "1.2.1"
|
Version = "1.2.2"
|
||||||
// https://play.golang.org/p/r6GNeV1gbH
|
// https://play.golang.org/p/r6GNeV1gbH
|
||||||
banner = "" +
|
banner = "" +
|
||||||
" \x1b[1;32m _____ _ _\n" +
|
" \x1b[1;32m _____ _ _\n" +
|
||||||
|
@ -38,6 +38,7 @@ type Fiber struct {
|
||||||
Engine *engine
|
Engine *engine
|
||||||
// https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/
|
// https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/
|
||||||
Prefork bool
|
Prefork bool
|
||||||
|
child bool
|
||||||
// Stores all routes
|
// Stores all routes
|
||||||
routes []*route
|
routes []*route
|
||||||
}
|
}
|
||||||
|
@ -72,6 +73,7 @@ func New() *Fiber {
|
||||||
Server: "",
|
Server: "",
|
||||||
Banner: true,
|
Banner: true,
|
||||||
Prefork: *prefork,
|
Prefork: *prefork,
|
||||||
|
child: *child,
|
||||||
Engine: &engine{
|
Engine: &engine{
|
||||||
Concurrency: 256 * 1024,
|
Concurrency: 256 * 1024,
|
||||||
DisableKeepAlive: false,
|
DisableKeepAlive: false,
|
||||||
|
|
|
@ -827,7 +827,7 @@ Sends the HTTP response.
|
||||||
The Send parameters can be of any type
|
The Send parameters can be of any type
|
||||||
```go
|
```go
|
||||||
// Function signature
|
// Function signature
|
||||||
c.Send(bodies ...interface{})
|
c.Send(body ...interface{})
|
||||||
|
|
||||||
// Example
|
// Example
|
||||||
app.Get("/", func(c *fiber.Ctx) {
|
app.Get("/", func(c *fiber.Ctx) {
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
window.$docsify = {
|
window.$docsify = {
|
||||||
name: 'Fiber v1.2.1',
|
name: 'Fiber v1.2.2',
|
||||||
repo: 'gofiber/fiber',
|
repo: 'gofiber/fiber',
|
||||||
loadSidebar: "sidebar.md",
|
loadSidebar: "sidebar.md",
|
||||||
homepage: 'getting_started.md',
|
homepage: 'getting_started.md',
|
||||||
|
|
1
go.sum
1
go.sum
|
@ -18,6 +18,7 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw
|
||||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||||
github.com/valyala/fasthttp v1.8.0 h1:actnGGBYtGQmxVaZxyZpp57Vcc2NhcO7mMN0IMwCC0w=
|
github.com/valyala/fasthttp v1.8.0 h1:actnGGBYtGQmxVaZxyZpp57Vcc2NhcO7mMN0IMwCC0w=
|
||||||
github.com/valyala/fasthttp v1.8.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w=
|
github.com/valyala/fasthttp v1.8.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w=
|
||||||
|
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a h1:0R4NLDRDZX6JcmhJgXi5E4b8Wg84ihbmUKp/GvSPEzc=
|
||||||
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
|
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
|
102
listen.go
102
listen.go
|
@ -17,6 +17,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/valyala/fasthttp"
|
"github.com/valyala/fasthttp"
|
||||||
|
"github.com/valyala/fasthttp/reuseport"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Listen : https://gofiber.github.io/fiber/#/application?id=listen
|
// Listen : https://gofiber.github.io/fiber/#/application?id=listen
|
||||||
|
@ -24,19 +25,16 @@ func (r *Fiber) Listen(address interface{}, tls ...string) {
|
||||||
host := ""
|
host := ""
|
||||||
switch val := address.(type) {
|
switch val := address.(type) {
|
||||||
case int:
|
case int:
|
||||||
// 8080 => ":8080"
|
host = ":" + strconv.Itoa(val) // 8080 => ":8080"
|
||||||
host = ":" + strconv.Itoa(val)
|
|
||||||
case string:
|
case string:
|
||||||
// Address needs to contain a semicolon
|
|
||||||
if !strings.Contains(val, ":") {
|
if !strings.Contains(val, ":") {
|
||||||
// "8080" => ":8080"
|
val = ":" + val // "8080" => ":8080"
|
||||||
val = ":" + val
|
|
||||||
}
|
}
|
||||||
host = val
|
host = val
|
||||||
default:
|
default:
|
||||||
panic("Host must be an INT port or STRING address")
|
panic("Host must be an INT port or STRING address")
|
||||||
}
|
}
|
||||||
// Copy settings to fasthttp server
|
// Create fasthttp server
|
||||||
server := &fasthttp.Server{
|
server := &fasthttp.Server{
|
||||||
Handler: r.handler,
|
Handler: r.handler,
|
||||||
Name: r.Server,
|
Name: r.Server,
|
||||||
|
@ -60,83 +58,69 @@ func (r *Fiber) Listen(address interface{}, tls ...string) {
|
||||||
NoDefaultContentType: r.Engine.NoDefaultContentType,
|
NoDefaultContentType: r.Engine.NoDefaultContentType,
|
||||||
KeepHijackedConns: r.Engine.KeepHijackedConns,
|
KeepHijackedConns: r.Engine.KeepHijackedConns,
|
||||||
}
|
}
|
||||||
// Print banner if enabled, ignore if child proccess
|
|
||||||
if r.Banner && !*child {
|
// Prefork enabled
|
||||||
if r.Prefork {
|
|
||||||
fmt.Printf(banner, Version, "-prefork", "Express on steriods", host)
|
|
||||||
} else {
|
|
||||||
fmt.Printf(banner, Version, "", "Express on steriods", host)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Create listener
|
|
||||||
var listener net.Listener
|
|
||||||
var err error
|
|
||||||
// If prefork enabled & enough cores
|
|
||||||
if r.Prefork && runtime.NumCPU() > 1 {
|
if r.Prefork && runtime.NumCPU() > 1 {
|
||||||
listener, err = r.reuseport(host)
|
if r.Banner && !r.child {
|
||||||
if err != nil {
|
cores := fmt.Sprintf("%s\x1b[1;30m %v cores", host, runtime.NumCPU())
|
||||||
panic(err)
|
fmt.Printf(banner, Version, " prefork", "Express on steriods", cores)
|
||||||
}
|
}
|
||||||
} else {
|
r.prefork(server, host, tls...)
|
||||||
listener, err = net.Listen("tcp4", host)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
runtime.GOMAXPROCS(runtime.NumCPU())
|
|
||||||
}
|
}
|
||||||
// Check ssl files are provided
|
// Prefork disabled
|
||||||
|
if r.Banner {
|
||||||
|
fmt.Printf(banner, Version, "", "Express on steriods", host)
|
||||||
|
}
|
||||||
|
ln, err := net.Listen("tcp4", host)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// enable TLS/HTTPS
|
||||||
if len(tls) > 1 {
|
if len(tls) > 1 {
|
||||||
if err := server.ServeTLS(listener, tls[0], tls[1]); err != nil {
|
if err := server.ServeTLS(ln, tls[0], tls[1]); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := server.Serve(listener); err != nil {
|
if err := server.Serve(ln); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: enable ipv6 support ~ tcp4 > tcp = tcp4+tcp6
|
|
||||||
// https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/
|
// https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/
|
||||||
func (r *Fiber) reuseport(host string) (net.Listener, error) {
|
func (r *Fiber) prefork(server *fasthttp.Server, host string, tls ...string) {
|
||||||
var listener net.Listener
|
// Master proc
|
||||||
if !*child {
|
if !r.child {
|
||||||
addr, err := net.ResolveTCPAddr("tcp4", host)
|
// Create babies
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
tcplistener, err := net.ListenTCP("tcp4", addr)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
file, err := tcplistener.File()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
childs := make([]*exec.Cmd, runtime.NumCPU())
|
childs := make([]*exec.Cmd, runtime.NumCPU())
|
||||||
for i := range childs {
|
for i := range childs {
|
||||||
childs[i] = exec.Command(os.Args[0], append(os.Args[1:], "-child")...)
|
childs[i] = exec.Command(os.Args[0], "-prefork", "-child")
|
||||||
childs[i].Stdout = os.Stdout
|
childs[i].Stdout = os.Stdout
|
||||||
childs[i].Stderr = os.Stderr
|
childs[i].Stderr = os.Stderr
|
||||||
childs[i].ExtraFiles = []*os.File{file}
|
|
||||||
if err := childs[i].Start(); err != nil {
|
if err := childs[i].Start(); err != nil {
|
||||||
return nil, err
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, child := range childs {
|
for _, child := range childs {
|
||||||
if err := child.Wait(); err != nil {
|
if err := child.Wait(); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
panic("Problem with calling os.Exit(0)")
|
|
||||||
} else {
|
|
||||||
// fmt.Printf(" \x1b[1;30mChild \x1b[1;32m#%v\x1b[1;30m reuseport\x1b[1;32m%s\x1b[0000m\n", os.Getpid(), host)
|
|
||||||
var err error
|
|
||||||
listener, err = net.FileListener(os.NewFile(3, ""))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
runtime.GOMAXPROCS(1)
|
|
||||||
}
|
}
|
||||||
return listener, nil
|
// Child proc
|
||||||
|
runtime.GOMAXPROCS(1)
|
||||||
|
ln, err := reuseport.Listen("tcp4", host)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
// enable TLS/HTTPS
|
||||||
|
if len(tls) > 1 {
|
||||||
|
if err := server.ServeTLS(ln, tls[0], tls[1]); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := server.Serve(ln); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,10 +152,6 @@ func (ctx *Ctx) BasicAuth() (user, pass string, ok bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Body : https://gofiber.github.io/fiber/#/context?id=body
|
// Body : https://gofiber.github.io/fiber/#/context?id=body
|
||||||
// curl -X POST \
|
|
||||||
// http://localhost:8080 \
|
|
||||||
// -H 'Content-Type: application/x-www-form-urlencoded' \
|
|
||||||
// -d john=doe
|
|
||||||
func (ctx *Ctx) Body(args ...interface{}) string {
|
func (ctx *Ctx) Body(args ...interface{}) string {
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
return getString(ctx.Fasthttp.Request.Body())
|
return getString(ctx.Fasthttp.Request.Body())
|
||||||
|
|
19
response.go
19
response.go
|
@ -218,15 +218,16 @@ func (ctx *Ctx) Render() {
|
||||||
|
|
||||||
// Send : https://gofiber.github.io/fiber/#/context?id=send
|
// Send : https://gofiber.github.io/fiber/#/context?id=send
|
||||||
func (ctx *Ctx) Send(args ...interface{}) {
|
func (ctx *Ctx) Send(args ...interface{}) {
|
||||||
for i := range args {
|
if len(args) == 0 {
|
||||||
switch body := args[i].(type) {
|
return
|
||||||
case string:
|
}
|
||||||
ctx.Fasthttp.Response.SetBodyString(body)
|
switch body := args[0].(type) {
|
||||||
case []byte:
|
case string:
|
||||||
ctx.Fasthttp.Response.SetBodyString(getString(body))
|
ctx.Fasthttp.Response.SetBodyString(body)
|
||||||
default:
|
case []byte:
|
||||||
ctx.Fasthttp.Response.SetBodyString(fmt.Sprintf("%v", body))
|
ctx.Fasthttp.Response.SetBodyString(getString(body))
|
||||||
}
|
default:
|
||||||
|
ctx.Fasthttp.Response.SetBodyString(fmt.Sprintf("%v", body))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1
types.go
1
types.go
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
package fiber
|
package fiber
|
||||||
|
|
||||||
|
// common content types
|
||||||
const (
|
const (
|
||||||
contentTypeJson = "application/json"
|
contentTypeJson = "application/json"
|
||||||
contentTypeJs = "application/javascript"
|
contentTypeJs = "application/javascript"
|
||||||
|
|
3
utils.go
3
utils.go
|
@ -71,8 +71,7 @@ func getType(ext string) (mime string) {
|
||||||
return mime
|
return mime
|
||||||
}
|
}
|
||||||
func getStatus(status int) (msg string) {
|
func getStatus(status int) (msg string) {
|
||||||
msg = statusMessages[status]
|
return statusMessages[status]
|
||||||
return msg
|
|
||||||
}
|
}
|
||||||
func getString(b []byte) string {
|
func getString(b []byte) string {
|
||||||
return *(*string)(unsafe.Pointer(&b))
|
return *(*string)(unsafe.Pointer(&b))
|
||||||
|
|
Loading…
Reference in New Issue