Skip to content

Commit 8355f4a

Browse files
committed
chore(binding): Optimizing the performance of bindings
Change-Id: I7c4ddb77ad5fb87e77986c37399951015e689412
1 parent 2ed918f commit 8355f4a

File tree

2 files changed

+45
-27
lines changed

2 files changed

+45
-27
lines changed

binding/bind.go

+4-18
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package binding
22

33
import (
44
jsonpkg "encoding/json"
5-
"mime/multipart"
65
"net/http"
76
"reflect"
87
"strings"
@@ -168,28 +167,18 @@ func (b *Binding) bindStruct(structPointer interface{}, structValue reflect.Valu
168167
return
169168
}
170169

171-
bodyCodec, bodyBytes, err := recv.getBodyInfo(req)
170+
var bodyString string
171+
bodyCodec, bodyBytes, postForm, fileHeaders, err := recv.getBodyInfo(req)
172172
if len(bodyBytes) > 0 {
173173
err = b.prebindBody(structPointer, structValue, bodyCodec, bodyBytes)
174-
}
175-
if err != nil {
176-
return
177-
}
178-
bodyString := ameda.UnsafeBytesToString(bodyBytes)
179-
postForm, err := req.GetPostForm()
180-
if err != nil {
181-
return
182-
}
183-
var fileHeaders map[string][]*multipart.FileHeader
184-
if _req, ok := req.(requestWithFileHeader); ok {
185-
fileHeaders, err = _req.GetFileHeaders()
186174
if err != nil {
187175
return
188176
}
177+
bodyString = ameda.UnsafeBytesToString(bodyBytes)
189178
}
190179
queryValues := recv.getQuery(req)
191180
cookies := recv.getCookies(req)
192-
var h http.Header
181+
h := recv.getHeader(req)
193182
for _, param := range recv.params {
194183
for i, info := range param.tagInfos {
195184
var found bool
@@ -204,9 +193,6 @@ func (b *Binding) bindStruct(structPointer interface{}, structValue reflect.Valu
204193
case cookie:
205194
found, err = param.bindCookie(info, expr, cookies)
206195
case header:
207-
if h == nil {
208-
h = req.GetHeader()
209-
}
210196
found, err = param.bindHeader(info, expr, h)
211197
case form, json, protobuf:
212198
if info.paramIn == in(bodyCodec) {

binding/receiver.go

+41-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package binding
22

33
import (
4+
"mime/multipart"
45
"net/http"
56
"net/url"
67
"reflect"
@@ -51,7 +52,7 @@ const (
5152
)
5253

5354
type receiver struct {
54-
hasPath, hasQuery, hasBody, hasCookie, hasDefaultVal, hasVd bool
55+
hasPath, hasQuery, hasForm, hasJson, hasProtobuf, hasRawBody, hasHeader, hasCookie, hasDefaultVal, hasVd bool
5556

5657
params []*paramInfo
5758

@@ -64,10 +65,18 @@ func (r *receiver) assginIn(i in, v bool) {
6465
r.hasPath = r.hasPath || v
6566
case query:
6667
r.hasQuery = r.hasQuery || v
67-
case form, json, protobuf, raw_body:
68-
r.hasBody = r.hasBody || v
68+
case form:
69+
r.hasForm = r.hasForm || v
70+
case json:
71+
r.hasJson = r.hasJson || v
72+
case protobuf:
73+
r.hasProtobuf = r.hasProtobuf || v
74+
case raw_body:
75+
r.hasRawBody = r.hasRawBody || v
6976
case cookie:
7077
r.hasCookie = r.hasCookie || v
78+
case header:
79+
r.hasHeader = r.hasHeader || v
7180
case default_val:
7281
r.hasDefaultVal = r.hasDefaultVal || v
7382
}
@@ -99,13 +108,29 @@ func (r *receiver) getOrAddParam(fh *tagexpr.FieldHandler, bindErrFactory func(f
99108
return p
100109
}
101110

102-
func (r *receiver) getBodyInfo(req Request) (codec, []byte, error) {
103-
if r.hasBody {
104-
c := getBodyCodec(req)
105-
b, err := req.GetBody()
106-
return c, b, err
111+
func (r *receiver) hasBody() bool {
112+
return r.hasForm || r.hasProtobuf || r.hasJson || r.hasRawBody
113+
}
114+
115+
func (r *receiver) getBodyInfo(req Request) (
116+
bodyCodec codec, bodyBytes []byte, postForm url.Values,
117+
fileHeaders map[string][]*multipart.FileHeader, err error,
118+
) {
119+
bodyCodec = bodyUnsupport
120+
if !r.hasBody() {
121+
return
122+
}
123+
bodyCodec = getBodyCodec(req)
124+
bodyBytes, err = req.GetBody()
125+
if err == nil && r.hasForm {
126+
postForm, err = req.GetPostForm()
127+
if err == nil {
128+
if _req, ok := req.(requestWithFileHeader); ok {
129+
fileHeaders, err = _req.GetFileHeaders()
130+
}
131+
}
107132
}
108-
return bodyUnsupport, nil, nil
133+
return
109134
}
110135

111136
func (b *Binding) prebindBody(pointer interface{}, val reflect.Value, bodyCodec codec, bodyBytes []byte) error {
@@ -137,6 +162,13 @@ func (r *receiver) getCookies(req Request) []*http.Cookie {
137162
return nil
138163
}
139164

165+
func (r *receiver) getHeader(req Request) http.Header {
166+
if r.hasHeader {
167+
return req.GetHeader()
168+
}
169+
return nil
170+
}
171+
140172
func (r *receiver) initParams() {
141173
names := make(map[string][maxIn]string, len(r.params))
142174
for _, p := range r.params {

0 commit comments

Comments
 (0)