optimize body

This commit is contained in:
bxd
2023-12-07 21:53:07 +08:00
parent 2d959bdeb3
commit 8e4ddfd0cc
5 changed files with 64 additions and 56 deletions

51
body.go
View File

@@ -14,6 +14,7 @@ import (
"github.com/gospider007/gson"
"github.com/gospider007/tools"
"golang.org/x/exp/maps"
)
const (
@@ -44,17 +45,13 @@ func (obj *orderMap) Del(key string) {
}
func (obj *orderMap) parseHeaders() (map[string][]string, []string) {
head := make(http.Header)
data := any2Map(obj.data)
if data == nil {
data = obj.data
}
for _, kk := range obj.order {
if vvs, ok := data[kk].([]any); ok {
if vvs, ok := obj.data[kk].([]any); ok {
for _, vv := range vvs {
head.Add(kk, fmt.Sprint(vv))
}
} else {
head.Add(kk, fmt.Sprint(data[kk]))
head.Add(kk, fmt.Sprint(obj.data[kk]))
}
}
return head, obj.order
@@ -143,12 +140,8 @@ func (obj *orderMap) isformPip() bool {
if len(obj.order) == 0 || len(obj.data) == 0 {
return false
}
data := any2Map(obj.data)
if data == nil {
data = obj.data
}
for _, key := range obj.order {
if vals, ok := data[key].([]any); ok {
if vals, ok := obj.data[key].([]any); ok {
for _, val := range vals {
if file, ok := val.(File); ok {
if _, ok := file.Content.(io.Reader); ok {
@@ -157,7 +150,7 @@ func (obj *orderMap) isformPip() bool {
}
}
} else {
if file, ok := data[key].(File); ok {
if file, ok := obj.data[key].(File); ok {
if _, ok := file.Content.(io.Reader); ok {
return true
}
@@ -167,19 +160,15 @@ func (obj *orderMap) isformPip() bool {
return false
}
func (obj *orderMap) formWriteMain(writer *multipart.Writer) (err error) {
data := any2Map(obj.data)
if data == nil {
data = obj.data
}
for _, key := range obj.order {
if vals, ok := data[key].([]any); ok {
if vals, ok := obj.data[key].([]any); ok {
for _, val := range vals {
if err = formWrite(writer, key, val); err != nil {
return
}
}
} else {
if err = formWrite(writer, key, data[key]); err != nil {
if err = formWrite(writer, key, obj.data[key]); err != nil {
return
}
}
@@ -196,18 +185,14 @@ func paramsWrite(buf *bytes.Buffer, key string, val any) {
buf.WriteString(url.QueryEscape(fmt.Sprint(val)))
}
func (obj *orderMap) parseParams() *bytes.Buffer {
data := any2Map(obj.data)
if data == nil {
data = obj.data
}
buf := bytes.NewBuffer(nil)
for _, k := range obj.order {
if vals, ok := data[k].([]any); ok {
if vals, ok := obj.data[k].([]any); ok {
for _, v := range vals {
paramsWrite(buf, k, v)
}
} else {
paramsWrite(buf, k, data[k])
paramsWrite(buf, k, obj.data[k])
}
}
return buf
@@ -269,7 +254,7 @@ func any2Map(val any) map[string]any {
for i := 0; i < sliceValue.Len(); i++ {
valueData2 = append(valueData2, sliceValue.Index(i).Interface())
}
valueData = valueData2
result[fmt.Sprint(key.Interface())] = valueData2
} else {
result[fmt.Sprint(key.Interface())] = valueData
}
@@ -319,20 +304,14 @@ mapL:
}
return nil, orderMap, nil, nil
case *orderMap:
if mapData := any2Map(value.data); mapData != nil {
value.data = mapData
}
return nil, value, nil, nil
case map[string]any:
orderMap := NewOrderMap()
for kk, vv := range value {
if vvs, ok := vv.([]any); ok {
vvData := make([]any, len(vvs))
for i, vv := range vvs {
vvData[i] = vv
}
orderMap.Set(kk, vvData)
} else {
orderMap.Set(kk, vv)
}
}
orderMap.data = value
orderMap.order = maps.Keys(value)
return nil, orderMap, nil, nil
}
if val, err = gson.Decode(val); err != nil {

6
go.mod
View File

@@ -13,7 +13,7 @@ require (
github.com/gospider007/tools v0.0.0-20231202084937-8b2bc66f8198
github.com/gospider007/websocket v0.0.0-20231128065110-6296f87425c4
github.com/refraction-networking/utls v1.5.4
golang.org/x/exp v0.0.0-20231127185646-65229373498e
golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb
golang.org/x/net v0.19.0
)
@@ -21,7 +21,7 @@ require (
github.com/PuerkitoBio/goquery v1.8.1 // indirect
github.com/andybalholm/brotli v1.0.6 // indirect
github.com/andybalholm/cascadia v1.3.2 // indirect
github.com/caddyserver/certmagic v0.19.2 // indirect
github.com/caddyserver/certmagic v0.20.0 // indirect
github.com/cloudflare/circl v1.3.6 // indirect
github.com/gaukas/godicttls v0.0.4 // indirect
github.com/gospider007/blog v0.0.0-20231121084103-59a004dafccf // indirect
@@ -39,7 +39,7 @@ require (
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
github.com/zeebo/blake3 v0.2.3 // indirect
go.mongodb.org/mongo-driver v1.13.0 // indirect
go.mongodb.org/mongo-driver v1.13.1 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.26.0 // indirect
golang.org/x/crypto v0.16.0 // indirect

6
go.sum
View File

@@ -7,6 +7,8 @@ github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsVi
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
github.com/caddyserver/certmagic v0.19.2 h1:HZd1AKLx4592MalEGQS39DKs2ZOAJCEM/xYPMQ2/ui0=
github.com/caddyserver/certmagic v0.19.2/go.mod h1:fsL01NomQ6N+kE2j37ZCnig2MFosG+MIO4ztnmG/zz8=
github.com/caddyserver/certmagic v0.20.0 h1:bTw7LcEZAh9ucYCRXyCpIrSAGplplI0vGYJ4BpCQ/Fc=
github.com/caddyserver/certmagic v0.20.0/go.mod h1:N4sXgpICQUskEWpj7zVzvWD41p3NYacrNoZYiRM2jTg=
github.com/cloudflare/circl v1.3.6 h1:/xbKIqSHbZXHwkhbrhrt2YOHIwYJlXH94E3tI/gDlUg=
github.com/cloudflare/circl v1.3.6/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -111,6 +113,8 @@ github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
go.mongodb.org/mongo-driver v1.13.0 h1:67DgFFjYOCMWdtTEmKFpV3ffWlFnh+CYZ8ZS/tXWUfY=
go.mongodb.org/mongo-driver v1.13.0/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ=
go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk=
go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo=
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
@@ -124,6 +128,8 @@ golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY=
golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No=
golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb h1:c0vyKkb6yr3KR7jEfJaOSv4lG7xPkbN6r52aJz1d8a8=
golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4=
golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=

View File

@@ -111,45 +111,68 @@ type File struct {
Content any
}
func (obj *RequestOption) initBody(ctx context.Context) (body io.Reader, err error) {
func (obj *RequestOption) initBody(ctx context.Context) (io.Reader, error) {
if obj.Body != nil {
body, _, _, err = obj.newBody(obj.Body, readType)
body, _, _, err := obj.newBody(obj.Body, readType)
if err != nil || body == nil {
return nil, err
}
return body, err
} else if obj.Form != nil {
var orderMap *orderMap
if body, orderMap, _, err = obj.newBody(obj.Form, mapType); err != nil {
return
_, orderMap, _, err := obj.newBody(obj.Form, mapType)
if err != nil {
return nil, err
}
tempBody, contentType, once, err := orderMap.parseForm(ctx)
body, contentType, once, err := orderMap.parseForm(ctx)
obj.once = once
if obj.ContentType == "" {
obj.ContentType = contentType
}
return tempBody, err
} else if obj.Data != nil {
var orderMap *orderMap
if _, orderMap, _, err = obj.newBody(obj.Data, mapType); err != nil {
return
if body == nil {
return body, nil
}
body = orderMap.parseData()
return body, nil
} else if obj.Data != nil {
_, orderMap, _, err := obj.newBody(obj.Data, mapType)
if err != nil {
return nil, err
}
body := orderMap.parseData()
if obj.ContentType == "" {
obj.ContentType = "application/x-www-form-urlencoded"
}
if body == nil {
return body, nil
}
return body, nil
} else if obj.Json != nil {
if body, _, _, err = obj.newBody(obj.Json, readType); err != nil {
return
body, _, _, err := obj.newBody(obj.Json, readType)
if err != nil {
return nil, err
}
if obj.ContentType == "" {
obj.ContentType = "application/json"
}
if body == nil {
return nil, nil
}
return body, nil
} else if obj.Text != nil {
if body, _, _, err = obj.newBody(obj.Text, readType); err != nil {
return
body, _, _, err := obj.newBody(obj.Text, readType)
if err != nil {
return nil, err
}
if obj.ContentType == "" {
obj.ContentType = "text/plain"
}
if body == nil {
return nil, err
}
return body, nil
} else {
return nil, nil
}
return
}
func (obj *RequestOption) initParams() (*url.URL, error) {
if obj.Params == nil {

View File

@@ -285,7 +285,7 @@ func (obj *Response) ReadBody() (err error) {
body: bBody,
}, obj.response.Body)
} else {
err = tools.CopyWitchContext(obj.response.Request.Context(), bBody, obj.response.Body)
err = tools.CopyWitchContext(obj.ctx, bBody, obj.response.Body)
}
if err != nil {
obj.ForceCloseConn()