@@ -167,7 +167,10 @@ func (c *Client) prepareRequest(ctx context.Context, method, url string, data ..
167
167
if ! gstr .ContainsI (url , httpProtocolName ) {
168
168
url = httpProtocolName + `://` + url
169
169
}
170
- var params string
170
+ var (
171
+ params string
172
+ allowFileUploading = true
173
+ )
171
174
if len (data ) > 0 {
172
175
switch c .header [httpHeaderContentType ] {
173
176
case httpHeaderContentTypeJson :
@@ -181,6 +184,7 @@ func (c *Client) prepareRequest(ctx context.Context, method, url string, data ..
181
184
params = string (b )
182
185
}
183
186
}
187
+ allowFileUploading = false
184
188
185
189
case httpHeaderContentTypeXml :
186
190
switch data [0 ].(type ) {
@@ -193,6 +197,8 @@ func (c *Client) prepareRequest(ctx context.Context, method, url string, data ..
193
197
params = string (b )
194
198
}
195
199
}
200
+ allowFileUploading = false
201
+
196
202
default :
197
203
params = httputil .BuildParams (data [0 ], c .noUrlEncode )
198
204
}
@@ -223,14 +229,18 @@ func (c *Client) prepareRequest(ctx context.Context, method, url string, data ..
223
229
return nil , err
224
230
}
225
231
} else {
226
- if strings .Contains (params , httpParamFileHolder ) {
232
+ if allowFileUploading && strings .Contains (params , httpParamFileHolder ) {
227
233
// File uploading request.
228
234
var (
229
- buffer = bytes .NewBuffer (nil )
230
- writer = multipart .NewWriter (buffer )
235
+ buffer = bytes .NewBuffer (nil )
236
+ writer = multipart .NewWriter (buffer )
237
+ isFileUploading = false
231
238
)
232
239
for _ , item := range strings .Split (params , "&" ) {
233
240
array := strings .Split (item , "=" )
241
+ if len (array ) < 2 {
242
+ continue
243
+ }
234
244
if len (array [1 ]) > 6 && strings .Compare (array [1 ][0 :6 ], httpParamFileHolder ) == 0 {
235
245
path := array [1 ][6 :]
236
246
if ! gfile .Exists (path ) {
@@ -241,43 +251,50 @@ func (c *Client) prepareRequest(ctx context.Context, method, url string, data ..
241
251
formFileName = gfile .Basename (path )
242
252
formFieldName = array [0 ]
243
253
)
254
+ // it sets post content type as `application/octet-stream`
244
255
if file , err = writer .CreateFormFile (formFieldName , formFileName ); err != nil {
245
- err = gerror .Wrapf (err , `CreateFormFile failed with "%s", "%s"` , formFieldName , formFileName )
256
+ return nil , gerror .Wrapf (
257
+ err , `CreateFormFile failed with "%s", "%s"` , formFieldName , formFileName ,
258
+ )
259
+ }
260
+ var f * os.File
261
+ if f , err = gfile .Open (path ); err != nil {
246
262
return nil , err
247
- } else {
248
- var f * os.File
249
- if f , err = gfile .Open (path ); err != nil {
250
- return nil , err
251
- }
252
- if _ , err = io .Copy (file , f ); err != nil {
253
- err = gerror .Wrapf (err , `io.Copy failed from "%s" to form "%s"` , path , formFieldName )
254
- _ = f .Close ()
255
- return nil , err
256
- }
263
+ }
264
+ if _ , err = io .Copy (file , f ); err != nil {
257
265
_ = f .Close ()
266
+ return nil , gerror .Wrapf (
267
+ err , `io.Copy failed from "%s" to form "%s"` , path , formFieldName ,
268
+ )
258
269
}
270
+ if err = f .Close (); err != nil {
271
+ return nil , gerror .Wrapf (err , `close file descriptor failed for "%s"` , path )
272
+ }
273
+ isFileUploading = true
259
274
} else {
260
275
var (
261
276
fieldName = array [0 ]
262
277
fieldValue = array [1 ]
263
278
)
264
279
if err = writer .WriteField (fieldName , fieldValue ); err != nil {
265
- err = gerror .Wrapf (err , `write form field failed with "%s", "%s"` , fieldName , fieldValue )
266
- return nil , err
280
+ return nil , gerror .Wrapf (
281
+ err , `write form field failed with "%s", "%s"` , fieldName , fieldValue ,
282
+ )
267
283
}
268
284
}
269
285
}
270
286
// Close finishes the multipart message and writes the trailing
271
287
// boundary end line to the output.
272
288
if err = writer .Close (); err != nil {
273
- err = gerror .Wrapf (err , `form writer close failed` )
274
- return nil , err
289
+ return nil , gerror .Wrapf (err , `form writer close failed` )
275
290
}
276
291
277
292
if req , err = http .NewRequest (method , url , buffer ); err != nil {
278
- err = gerror .Wrapf (err , `http.NewRequest failed for method "%s" and URL "%s"` , method , url )
279
- return nil , err
280
- } else {
293
+ return nil , gerror .Wrapf (
294
+ err , `http.NewRequest failed for method "%s" and URL "%s"` , method , url ,
295
+ )
296
+ }
297
+ if isFileUploading {
281
298
req .Header .Set (httpHeaderContentType , writer .FormDataContentType ())
282
299
}
283
300
} else {
@@ -286,18 +303,17 @@ func (c *Client) prepareRequest(ctx context.Context, method, url string, data ..
286
303
if req , err = http .NewRequest (method , url , bytes .NewReader (paramBytes )); err != nil {
287
304
err = gerror .Wrapf (err , `http.NewRequest failed for method "%s" and URL "%s"` , method , url )
288
305
return nil , err
289
- } else {
290
- if v , ok := c .header [httpHeaderContentType ]; ok {
291
- // Custom Content-Type.
292
- req .Header .Set (httpHeaderContentType , v )
293
- } else if len (paramBytes ) > 0 {
294
- if (paramBytes [0 ] == '[' || paramBytes [0 ] == '{' ) && json .Valid (paramBytes ) {
295
- // Auto-detecting and setting the post content format: JSON.
296
- req .Header .Set (httpHeaderContentType , httpHeaderContentTypeJson )
297
- } else if gregex .IsMatchString (httpRegexParamJson , params ) {
298
- // If the parameters passed like "name=value", it then uses form type.
299
- req .Header .Set (httpHeaderContentType , httpHeaderContentTypeForm )
300
- }
306
+ }
307
+ if v , ok := c .header [httpHeaderContentType ]; ok {
308
+ // Custom Content-Type.
309
+ req .Header .Set (httpHeaderContentType , v )
310
+ } else if len (paramBytes ) > 0 {
311
+ if (paramBytes [0 ] == '[' || paramBytes [0 ] == '{' ) && json .Valid (paramBytes ) {
312
+ // Auto-detecting and setting the post content format: JSON.
313
+ req .Header .Set (httpHeaderContentType , httpHeaderContentTypeJson )
314
+ } else if gregex .IsMatchString (httpRegexParamJson , params ) {
315
+ // If the parameters passed like "name=value", it then uses form type.
316
+ req .Header .Set (httpHeaderContentType , httpHeaderContentTypeForm )
301
317
}
302
318
}
303
319
}
0 commit comments