Add BodyParser v1.6.0

pull/137/head
Fenny 2020-02-13 06:48:14 +01:00
parent 2dbaf3ced9
commit cd7338dbe0
6 changed files with 52 additions and 10 deletions

View File

View File

@ -93,6 +93,7 @@ type engine struct {
// New https://fiber.wiki/application#new // New https://fiber.wiki/application#new
func New() *Application { func New() *Application {
flag.Parse() flag.Parse()
schemaDecoder.SetAliasTag("form")
return &Application{ return &Application{
Server: "", Server: "",
httpServer: nil, httpServer: nil,

1
go.mod
View File

@ -3,6 +3,7 @@ module github.com/gofiber/fiber
go 1.11 go 1.11
require ( require (
github.com/gorilla/schema v1.1.0
github.com/json-iterator/go v1.1.9 github.com/json-iterator/go v1.1.9
github.com/valyala/fasthttp v1.9.0 github.com/valyala/fasthttp v1.9.0
) )

2
go.sum
View File

@ -1,6 +1,8 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/gorilla/schema v1.1.0 h1:CamqUDOFUBqzrvxuz2vEwo8+SUdwsluFh7IlzJh30LY=
github.com/gorilla/schema v1.1.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU=
github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/klauspost/compress v1.8.2 h1:Bx0qjetmNjdFXASH02NSAREKpiaDwkO1DRZ3dV2KCcs= github.com/klauspost/compress v1.8.2 h1:Bx0qjetmNjdFXASH02NSAREKpiaDwkO1DRZ3dV2KCcs=

View File

@ -13,6 +13,7 @@ import (
"fmt" "fmt"
"mime" "mime"
"mime/multipart" "mime/multipart"
"net/url"
"strings" "strings"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
@ -198,13 +199,33 @@ func (ctx *Ctx) Body(args ...interface{}) string {
// BodyParser : https://fiber.wiki/context#bodyparser // BodyParser : https://fiber.wiki/context#bodyparser
func (ctx *Ctx) BodyParser(v interface{}) error { func (ctx *Ctx) BodyParser(v interface{}) error {
cType := getString(ctx.Fasthttp.Request.Header.ContentType()) ctype := getString(ctx.Fasthttp.Request.Header.ContentType())
if cType == contentTypeJSON { // application/json
return jsoniter.Unmarshal(ctx.Fasthttp.Request.Body(), &v) if strings.HasPrefix(ctype, mimeApplicationJSON) {
} else if cType == contentTypeXML { return jsoniter.Unmarshal(ctx.Fasthttp.Request.Body(), v)
return xml.Unmarshal(ctx.Fasthttp.Request.Body(), &v)
} }
return fmt.Errorf("cannot parse content-type: %v", cType) // application/xml text/xml
if strings.HasPrefix(ctype, mimeApplicationXML) || strings.HasPrefix(ctype, mimeTextXML) {
return xml.Unmarshal(ctx.Fasthttp.Request.Body(), v)
}
// application/x-www-form-urlencoded
if strings.HasPrefix(ctype, mimeApplicationForm) {
data, err := url.ParseQuery(getString(ctx.Fasthttp.PostBody()))
if err != nil {
return err
}
return schemaDecoder.Decode(v, data)
}
// multipart/form-data
if strings.HasPrefix(ctype, mimeMultipartForm) {
data, err := ctx.Fasthttp.MultipartForm()
if err != nil {
return err
}
return schemaDecoder.Decode(v, data.Value)
}
return fmt.Errorf("cannot parse content-type: %v", ctype)
} }
// Cookies : https://fiber.wiki/context#cookies // Cookies : https://fiber.wiki/context#cookies

View File

@ -18,8 +18,12 @@ import (
"strings" "strings"
"time" "time"
"unsafe" "unsafe"
"github.com/gorilla/schema"
) )
var schemaDecoder = schema.NewDecoder()
func getParams(path string) (params []string) { func getParams(path string) (params []string) {
segments := strings.Split(path, "/") segments := strings.Split(path, "/")
replacer := strings.NewReplacer(":", "", "?", "") replacer := strings.NewReplacer(":", "", "?", "")
@ -209,10 +213,23 @@ var statusMessages = map[int]string{
} }
const ( const (
contentTypeJSON = "application/json" contentTypeJSON = "application/json"
contentTypeJs = "application/javascript" contentTypeJs = "application/javascript"
contentTypeXML = "application/xml" contentTypeXML = "application/xml"
contentTypeOctetStream = "application/octet-stream" contentTypeOctetStream = "application/octet-stream"
contentTypeFormURLEncoded = "application/x-www-form-urlencoded"
contentTypeMultipartFormData = "multipart/form-data"
)
const (
mimeApplicationJSON = "application/json"
mimeApplicationJavascrippt = "application/javascript"
mimeApplicationXML = "application/xml"
mimeTextXML = "text/xml"
mimeApplicationOctetStream = "application/octet-stream"
mimeApplicationFormURLEncoded = "application/x-www-form-urlencoded"
mimeApplicationForm = "application/x-www-form-urlencoded"
mimeMultipartForm = "multipart/form-data"
) )
// https://github.com/nginx/nginx/blob/master/conf/mime.types // https://github.com/nginx/nginx/blob/master/conf/mime.types