From d2c07a58affecc3fb049652ee7a435c382e3a4d0 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 27 Sep 2013 22:11:57 +0300 Subject: [PATCH] Issue #19053: ZipExtFile.read1() with non-zero argument no more returns empty bytes until end of data. --- Lib/test/test_zipfile.py | 39 +++++++++++++++++++++++++++++++++++++++ Lib/zipfile.py | 23 +++++++++++++++-------- Misc/NEWS | 3 +++ 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index fb866d8b4dc..ad0c0b7b416 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -158,6 +158,45 @@ class AbstractTestsWithSourceFile: for f in get_files(self): self.zip_random_open_test(f, self.compression) + def zip_read1_test(self, f, compression): + self.make_test_archive(f, compression) + + # Read the ZIP archive + with zipfile.ZipFile(f, "r") as zipfp, \ + zipfp.open(TESTFN) as zipopen: + zipdata = [] + while True: + read_data = zipopen.read1(-1) + if not read_data: + break + zipdata.append(read_data) + + self.assertEqual(b''.join(zipdata), self.data) + + def test_read1(self): + for f in get_files(self): + self.zip_read1_test(f, self.compression) + + def zip_read1_10_test(self, f, compression): + self.make_test_archive(f, compression) + + # Read the ZIP archive + with zipfile.ZipFile(f, "r") as zipfp, \ + zipfp.open(TESTFN) as zipopen: + zipdata = [] + while True: + read_data = zipopen.read1(10) + self.assertLessEqual(len(read_data), 10) + if not read_data: + break + zipdata.append(read_data) + + self.assertEqual(b''.join(zipdata), self.data) + + def test_read1_10(self): + for f in get_files(self): + self.zip_read1_10_test(f, self.compression) + def zip_readline_read_test(self, f, compression): self.make_test_archive(f, compression) diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 3448c61795d..92c98abe1eb 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -785,8 +785,11 @@ class ZipExtFile(io.BufferedIOBase): buf = self._readbuffer[self._offset:] self._readbuffer = b'' self._offset = 0 - data = self._read1(self.MAX_N) - buf += data + while not self._eof: + data = self._read1(self.MAX_N) + if data: + buf += data + break return buf end = n + self._offset @@ -800,12 +803,16 @@ class ZipExtFile(io.BufferedIOBase): self._readbuffer = b'' self._offset = 0 if n > 0: - data = self._read1(n) - if n < len(data): - self._readbuffer = data - self._offset = n - data = data[:n] - buf += data + while not self._eof: + data = self._read1(n) + if n < len(data): + self._readbuffer = data + self._offset = n + buf += data[:n] + break + if data: + buf += data + break return buf def _read1(self, n): diff --git a/Misc/NEWS b/Misc/NEWS index 78b923d0eb4..6289eb254fd 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -71,6 +71,9 @@ Core and Builtins Library ------- +- Issue #19053: ZipExtFile.read1() with non-zero argument no more returns empty + bytes until end of data. + - Issue #19028: Fixed tkinter.Tkapp.merge() for non-string arguments. - Issue #3015: Fixed tkinter with wantobject=False. Any Tcl command call