1
1
package binding
2
2
3
3
import (
4
+ "mime/multipart"
4
5
"net/http"
5
6
"net/url"
6
7
"reflect"
@@ -51,7 +52,7 @@ const (
51
52
)
52
53
53
54
type receiver struct {
54
- hasPath , hasQuery , hasBody , hasCookie , hasDefaultVal , hasVd bool
55
+ hasPath , hasQuery , hasForm , hasJson , hasProtobuf , hasRawBody , hasHeader , hasCookie , hasDefaultVal , hasVd bool
55
56
56
57
params []* paramInfo
57
58
@@ -64,10 +65,18 @@ func (r *receiver) assginIn(i in, v bool) {
64
65
r .hasPath = r .hasPath || v
65
66
case query :
66
67
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
69
76
case cookie :
70
77
r .hasCookie = r .hasCookie || v
78
+ case header :
79
+ r .hasHeader = r .hasHeader || v
71
80
case default_val :
72
81
r .hasDefaultVal = r .hasDefaultVal || v
73
82
}
@@ -99,13 +108,29 @@ func (r *receiver) getOrAddParam(fh *tagexpr.FieldHandler, bindErrFactory func(f
99
108
return p
100
109
}
101
110
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
+ }
107
132
}
108
- return bodyUnsupport , nil , nil
133
+ return
109
134
}
110
135
111
136
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 {
137
162
return nil
138
163
}
139
164
165
+ func (r * receiver ) getHeader (req Request ) http.Header {
166
+ if r .hasHeader {
167
+ return req .GetHeader ()
168
+ }
169
+ return nil
170
+ }
171
+
140
172
func (r * receiver ) initParams () {
141
173
names := make (map [string ][maxIn ]string , len (r .params ))
142
174
for _ , p := range r .params {
0 commit comments