summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2013-09-27 19:11:57 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2013-09-27 19:11:57 (GMT)
commitd2c07a58affecc3fb049652ee7a435c382e3a4d0 (patch)
tree07a07c8b2115e859192c8b0d18eb116e71bcb3ed
parent1f09c663add7edc6af0093d1eb3eca02bd0864b9 (diff)
downloadcpython-d2c07a58affecc3fb049652ee7a435c382e3a4d0.zip
cpython-d2c07a58affecc3fb049652ee7a435c382e3a4d0.tar.gz
cpython-d2c07a58affecc3fb049652ee7a435c382e3a4d0.tar.bz2
Issue #19053: ZipExtFile.read1() with non-zero argument no more returns empty
bytes until end of data.
-rw-r--r--Lib/test/test_zipfile.py39
-rw-r--r--Lib/zipfile.py23
-rw-r--r--Misc/NEWS3
3 files changed, 57 insertions, 8 deletions
diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py
index fb866d8..ad0c0b7 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 3448c61..92c98ab 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 78b923d..6289eb2 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