From 23e95656f2e4e8325b03e72df7b9f0ba6197b45a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 29 Nov 2018 20:19:04 +0100 Subject: [PATCH] Don't expose io.EOF in multifilereader --- multifilereader.go | 2 +- multifilereader_test.go | 10 +++++++--- multipartfile.go | 14 +++++++++++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/multifilereader.go b/multifilereader.go index 52d9f4c..758b501 100644 --- a/multifilereader.go +++ b/multifilereader.go @@ -70,7 +70,7 @@ func (mfr *MultiFileReader) Read(buf []byte) (written int, err error) { if !mfr.files[len(mfr.files)-1].Next() { if mfr.files[len(mfr.files)-1].Err() != nil { - return 0, err + return 0, mfr.files[len(mfr.files)-1].Err() } mfr.files = mfr.files[:len(mfr.files)-1] mfr.path = mfr.path[:len(mfr.path)-1] diff --git a/multifilereader_test.go b/multifilereader_test.go index 8df39a8..46efe0e 100644 --- a/multifilereader_test.go +++ b/multifilereader_test.go @@ -61,16 +61,20 @@ func TestMultiFileReaderToMultiFile(t *testing.T) { t.Fatal("iterator didn't work as expected") } - if subIt.Next() { + if subIt.Next() || it.Err() != nil { t.Fatal("iterator didn't work as expected") } // try to break internal state - if subIt.Next() { + if subIt.Next() || it.Err() != nil { t.Fatal("iterator didn't work as expected") } - if !it.Next() || it.Name() != "beep.txt" || it.Dir() != nil { + if !it.Next() || it.Name() != "beep.txt" || it.Dir() != nil || it.Err() != nil { + t.Fatal("iterator didn't work as expected") + } + + if it.Next() || it.Err() != nil { t.Fatal("iterator didn't work as expected") } } diff --git a/multipartfile.go b/multipartfile.go index 86cef0f..651bfdb 100644 --- a/multipartfile.go +++ b/multipartfile.go @@ -2,6 +2,7 @@ package files import ( "errors" + "io" "io/ioutil" "mime" "mime/multipart" @@ -127,6 +128,9 @@ func (it *multipartIterator) Next() bool { } part, err := it.f.Reader.NextPart() if err != nil { + if err == io.EOF { + return false + } it.err = err return false } @@ -198,7 +202,15 @@ func (pr *peekReader) NextPart() (*multipart.Part, error) { return p, nil } - return pr.r.NextPart() + if pr.r == nil { + return nil, io.EOF + } + + p, err := pr.r.NextPart() + if err == io.EOF { + pr.r = nil + } + return p, err } func (pr *peekReader) put(p *multipart.Part) error {