mirror of https://github.com/python/cpython
Merged revisions 85291 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r85291 | antoine.pitrou | 2010-10-06 23:21:18 +0200 (mer., 06 oct. 2010) | 4 lines Issue #9759: GzipFile now raises ValueError when an operation is attempted after the file is closed. Patch by Jeffrey Finkelstein. ........
This commit is contained in:
parent
2471063dc7
commit
76a66aab19
10
Lib/gzip.py
10
Lib/gzip.py
|
@ -138,6 +138,13 @@ class GzipFile(io.BufferedIOBase):
|
|||
s = repr(self.fileobj)
|
||||
return '<gzip ' + s[1:-1] + ' ' + hex(id(self)) + '>'
|
||||
|
||||
def _check_closed(self):
|
||||
"""Raises a ValueError if the underlying file object has been closed.
|
||||
|
||||
"""
|
||||
if self.closed:
|
||||
raise ValueError('I/O operation on closed file.')
|
||||
|
||||
def _init_write(self, filename):
|
||||
self.name = filename
|
||||
self.crc = zlib.crc32("") & 0xffffffffL
|
||||
|
@ -202,6 +209,7 @@ class GzipFile(io.BufferedIOBase):
|
|||
self.fileobj.read(2) # Read & discard the 16-bit header CRC
|
||||
|
||||
def write(self,data):
|
||||
self._check_closed()
|
||||
if self.mode != WRITE:
|
||||
import errno
|
||||
raise IOError(errno.EBADF, "write() on read-only GzipFile object")
|
||||
|
@ -222,6 +230,7 @@ class GzipFile(io.BufferedIOBase):
|
|||
return len(data)
|
||||
|
||||
def read(self, size=-1):
|
||||
self._check_closed()
|
||||
if self.mode != READ:
|
||||
import errno
|
||||
raise IOError(errno.EBADF, "read() on write-only GzipFile object")
|
||||
|
@ -359,6 +368,7 @@ class GzipFile(io.BufferedIOBase):
|
|||
self.myfileobj = None
|
||||
|
||||
def flush(self,zlib_mode=zlib.Z_SYNC_FLUSH):
|
||||
self._check_closed()
|
||||
if self.mode == WRITE:
|
||||
# Ensure the compressor's buffer is flushed
|
||||
self.fileobj.write(self.compress.flush(zlib_mode))
|
||||
|
|
|
@ -51,6 +51,28 @@ class TestGzip(unittest.TestCase):
|
|||
f = gzip.GzipFile(self.filename, 'r') ; d = f.read() ; f.close()
|
||||
self.assertEqual(d, data1*50)
|
||||
|
||||
def test_io_on_closed_object(self):
|
||||
# Test that I/O operations on closed GzipFile objects raise a
|
||||
# ValueError, just like the corresponding functions on file objects.
|
||||
|
||||
# Write to a file, open it for reading, then close it.
|
||||
self.test_write()
|
||||
f = gzip.GzipFile(self.filename, 'r')
|
||||
f.close()
|
||||
with self.assertRaises(ValueError):
|
||||
f.read(1)
|
||||
with self.assertRaises(ValueError):
|
||||
f.seek(0)
|
||||
with self.assertRaises(ValueError):
|
||||
f.tell()
|
||||
# Open the file for writing, then close it.
|
||||
f = gzip.GzipFile(self.filename, 'w')
|
||||
f.close()
|
||||
with self.assertRaises(ValueError):
|
||||
f.write(b'')
|
||||
with self.assertRaises(ValueError):
|
||||
f.flush()
|
||||
|
||||
def test_append(self):
|
||||
self.test_write()
|
||||
# Append to the previous file
|
||||
|
|
Loading…
Reference in New Issue