Skip to content

Commit 9750e2a

Browse files
fix: always close form file
Signed-off-by: Artur Melanchyk <13834276+arturmelanchyk@users.noreply.github.com>
1 parent e8f639a commit 9750e2a

1 file changed

Lines changed: 33 additions & 21 deletions

File tree

client/hooks.go

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -269,43 +269,55 @@ func parserRequestBodyFile(req *Request) error {
269269

270270
defer fileBufPool.Put(fileBuf)
271271

272-
for i, v := range req.files {
273-
if v.name == "" && v.path == "" {
272+
for i, f := range req.files {
273+
if f.name == "" && f.path == "" {
274274
return ErrFileNoName
275275
}
276276

277277
// Set the file name if not provided.
278-
if v.name == "" && v.path != "" {
279-
v.path = filepath.Clean(v.path)
280-
v.name = filepath.Base(v.path)
278+
if f.name == "" && f.path != "" {
279+
f.path = filepath.Clean(f.path)
280+
f.name = filepath.Base(f.path)
281281
}
282282

283283
// Set the field name if not provided.
284-
if v.fieldName == "" {
285-
v.fieldName = "file" + strconv.Itoa(i+1)
284+
if f.fieldName == "" {
285+
f.fieldName = "file" + strconv.Itoa(i+1)
286286
}
287287

288-
// If reader is not set, open the file.
289-
if v.reader == nil {
290-
v.reader, err = os.Open(v.path)
291-
if err != nil {
292-
return fmt.Errorf("open file error: %w", err)
293-
}
288+
if err := addFormFile(mw, f, fileBuf); err != nil {
289+
return err
294290
}
291+
}
292+
293+
return nil
294+
}
295295

296-
// Create form file and copy the content.
297-
w, err := mw.CreateFormFile(v.fieldName, v.name)
296+
func addFormFile(mw *multipart.Writer, f *File, fileBuf *[]byte) (e error) {
297+
// If reader is not set, open the file.
298+
if f.reader == nil {
299+
var err error
300+
f.reader, err = os.Open(f.path)
298301
if err != nil {
299-
return fmt.Errorf("create file error: %w", err)
302+
return fmt.Errorf("open file error: %w", err)
300303
}
304+
}
301305

302-
if _, err := io.CopyBuffer(w, v.reader, *fileBuf); err != nil {
303-
return fmt.Errorf("failed to copy file data: %w", err)
306+
// Ensure the file reader is always closed after copying.
307+
defer func() {
308+
if err := f.reader.Close(); err != nil {
309+
e = fmt.Errorf("close file error: %w", err)
304310
}
311+
}()
305312

306-
if err := v.reader.Close(); err != nil {
307-
return fmt.Errorf("close file error: %w", err)
308-
}
313+
// Create form file and copy the content.
314+
w, err := mw.CreateFormFile(f.fieldName, f.name)
315+
if err != nil {
316+
return fmt.Errorf("create file error: %w", err)
317+
}
318+
319+
if _, err := io.CopyBuffer(w, f.reader, *fileBuf); err != nil {
320+
return fmt.Errorf("failed to copy file data: %w", err)
309321
}
310322

311323
return nil

0 commit comments

Comments
 (0)