@@ -2,6 +2,7 @@ package req
2
2
3
3
import (
4
4
"bytes"
5
+ "errors"
5
6
"io"
6
7
"mime/multipart"
7
8
"net/http"
@@ -124,17 +125,30 @@ func writeMultipartFormFile(w *multipart.Writer, file *FileUpload, r *Request) e
124
125
125
126
func writeMultiPart (r * Request , w * multipart.Writer ) {
126
127
defer w .Close () // close multipart to write tailer boundary
127
- for k , vs := range r .FormData {
128
- for _ , v := range vs {
129
- w .WriteField (k , v )
128
+ if len (r .FormData ) > 0 {
129
+ for k , vs := range r .FormData {
130
+ for _ , v := range vs {
131
+ w .WriteField (k , v )
132
+ }
133
+ }
134
+ } else if len (r .OrderedFormData ) > 0 {
135
+ if len (r .OrderedFormData )% 2 != 0 {
136
+ r .error = errBadOrderedFormData
137
+ return
138
+ }
139
+ maxIndex := len (r .OrderedFormData ) - 2
140
+ for i := 0 ; i <= maxIndex ; i += 2 {
141
+ key := r .OrderedFormData [i ]
142
+ value := r .OrderedFormData [i + 1 ]
143
+ w .WriteField (key , value )
130
144
}
131
145
}
132
146
for _ , file := range r .uploadFiles {
133
147
writeMultipartFormFile (w , file , r )
134
148
}
135
149
}
136
150
137
- func handleMultiPart (c * Client , r * Request ) (err error ) {
151
+ func handleMultiPart (r * Request ) (err error ) {
138
152
if r .forceChunkedEncoding {
139
153
pr , pw := io .Pipe ()
140
154
r .GetBody = func () (io.ReadCloser , error ) {
@@ -164,6 +178,29 @@ func handleFormData(r *Request) {
164
178
r .SetBodyBytes ([]byte (r .FormData .Encode ()))
165
179
}
166
180
181
+ var errBadOrderedFormData = errors .New ("bad ordered form data, the number of key-value pairs should be an even number" )
182
+
183
+ func handleOrderedFormData (r * Request ) {
184
+ r .SetContentType (header .FormContentType )
185
+ if len (r .OrderedFormData )% 2 != 0 {
186
+ r .error = errBadOrderedFormData
187
+ return
188
+ }
189
+ maxIndex := len (r .OrderedFormData ) - 2
190
+ var buf strings.Builder
191
+ for i := 0 ; i <= maxIndex ; i += 2 {
192
+ key := r .OrderedFormData [i ]
193
+ value := r .OrderedFormData [i + 1 ]
194
+ if buf .Len () > 0 {
195
+ buf .WriteByte ('&' )
196
+ }
197
+ buf .WriteString (url .QueryEscape (key ))
198
+ buf .WriteByte ('=' )
199
+ buf .WriteString (url .QueryEscape (value ))
200
+ }
201
+ r .SetBodyString (buf .String ())
202
+ }
203
+
167
204
func handleMarshalBody (c * Client , r * Request ) error {
168
205
ct := ""
169
206
if r .Headers != nil {
@@ -205,16 +242,20 @@ func parseRequestBody(c *Client, r *Request) (err error) {
205
242
}
206
243
// handle multipart
207
244
if r .isMultiPart {
208
- return handleMultiPart (c , r )
245
+ return handleMultiPart (r )
209
246
}
210
247
211
248
// handle form data
212
249
if len (c .FormData ) > 0 {
213
250
r .SetFormDataFromValues (c .FormData )
214
251
}
252
+
215
253
if len (r .FormData ) > 0 {
216
254
handleFormData (r )
217
255
return
256
+ } else if len (r .OrderedFormData ) > 0 {
257
+ handleOrderedFormData (r )
258
+ return
218
259
}
219
260
220
261
// handle marshal body
0 commit comments