@@ -3,11 +3,11 @@ package binding
33import (
44 "net/http"
55 "reflect"
6+ "sync"
67 _ "unsafe"
78
89 "github.com/bytedance/go-tagexpr"
910 "github.com/bytedance/go-tagexpr/validator"
10- "github.com/henrylee2cn/goutil"
1111 "github.com/henrylee2cn/goutil/tpack"
1212)
1313
@@ -27,7 +27,8 @@ const (
2727type Binding struct {
2828 level Level
2929 vd * validator.Validator
30- recvs goutil.Map
30+ recvs map [int32 ]* receiver
31+ lock sync.RWMutex
3132 bindErrFactory func (failField , msg string ) error
3233}
3334
@@ -40,7 +41,7 @@ func New(tagName string) *Binding {
4041 }
4142 b := & Binding {
4243 vd : validator .New (tagName ),
43- recvs : goutil . AtomicMap ( ),
44+ recvs : make ( map [ int32 ] * receiver , 1024 ),
4445 }
4546 return b .SetLevel (FirstAndTagged ).SetErrorFactory (nil , nil )
4647}
@@ -124,16 +125,18 @@ func (b *Binding) structValueOf(structPointer interface{}) (reflect.Value, error
124125
125126func (b * Binding ) getObjOrPrepare (value reflect.Value ) (* receiver , error ) {
126127 runtimeTypeID := tpack .From (value ).RuntimeTypeID ()
127- i , ok := b .recvs .Load (runtimeTypeID )
128+ b .lock .RLock ()
129+ recv , ok := b .recvs [runtimeTypeID ]
130+ b .lock .RUnlock ()
128131 if ok {
129- return i .( * receiver ) , nil
132+ return recv , nil
130133 }
131134
132135 expr , err := b .vd .VM ().Run (reflect .New (value .Type ()).Elem ())
133136 if err != nil {
134137 return nil , err
135138 }
136- var recv = & receiver {
139+ recv = & receiver {
137140 params : make ([]* paramInfo , 0 , 16 ),
138141 }
139142 var errExprSelector tagexpr.ExprSelector
@@ -239,7 +242,10 @@ func (b *Binding) getObjOrPrepare(value reflect.Value) (*receiver, error) {
239242
240243 recv .initParams ()
241244
242- b .recvs .Store (runtimeTypeID , recv )
245+ b .lock .Lock ()
246+ b .recvs [runtimeTypeID ] = recv
247+ b .lock .Unlock ()
248+
243249 return recv , nil
244250}
245251
@@ -256,7 +262,7 @@ func (b *Binding) bind(value reflect.Value, req *http.Request, pathParams PathPa
256262
257263 bodyCodec := recv .getBodyCodec (req )
258264
259- bodyBytes , err := recv .getBodyBytes (req , bodyCodec == jsonBody )
265+ bodyBytes , bodyString , err := recv .getBody (req , bodyCodec == jsonBody )
260266 if err != nil {
261267 return false , err
262268 }
@@ -280,12 +286,24 @@ func (b *Binding) bind(value reflect.Value, req *http.Request, pathParams PathPa
280286 case cookie :
281287 err = param .bindCookie (expr , cookies )
282288 case body :
283- _ , err = param .bindBody (expr , bodyCodec , postForm , bodyBytes )
289+ switch bodyCodec {
290+ case formBody :
291+ _ , err = param .bindMapStrings (expr , postForm )
292+ case jsonBody :
293+ _ , err = param .bindJSON (expr , bodyString )
294+ default :
295+ err = param .contentTypeError
296+ }
284297 case raw_body :
285298 err = param .bindRawBody (expr , bodyBytes )
286299 default :
287300 var found bool
288- found , err = param .bindBody (expr , bodyCodec , postForm , bodyBytes )
301+ switch bodyCodec {
302+ case formBody :
303+ found , err = param .bindMapStrings (expr , postForm )
304+ case jsonBody :
305+ found , err = param .bindJSON (expr , bodyString )
306+ }
289307 if ! found {
290308 _ , err = param .bindQuery (expr , queryValues )
291309 }
0 commit comments