Issue #9962: GzipFile now has the peek() method.
diff --git a/Lib/gzip.py b/Lib/gzip.py
index 3edc839..58e866b 100644
--- a/Lib/gzip.py
+++ b/Lib/gzip.py
@@ -204,7 +204,10 @@
return self.name
def __repr__(self):
- s = repr(self.fileobj)
+ fileobj = self.fileobj
+ if isinstance(fileobj, _PaddedFile):
+ fileobj = fileobj.file
+ s = repr(fileobj)
return '<gzip ' + s[1:-1] + ' ' + hex(id(self)) + '>'
def _init_write(self, filename):
@@ -336,6 +339,26 @@
self.offset += size
return chunk
+ def peek(self, n):
+ if self.mode != READ:
+ import errno
+ raise IOError(errno.EBADF, "read() on write-only GzipFile object")
+
+ # Do not return ridiculously small buffers
+ if n < 100:
+ n = 100
+ if self.extrasize == 0:
+ if self.fileobj is None:
+ return b''
+ try:
+ self._read(max(self.max_read_chunk, n))
+ except EOFError:
+ pass
+ offset = self.offset - self.extrastart
+ remaining = self.extrasize
+ assert remaining == len(self.extrabuf) - offset
+ return self.extrabuf[offset:offset + n]
+
def _unread(self, buf):
self.extrasize = len(buf) + self.extrasize
self.offset -= len(buf)