aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Chargin <wchargin@gmail.com>2020-01-21 03:25:24 -0800
committerSerhiy Storchaka <storchaka@gmail.com>2020-01-21 13:25:24 +0200
commiteab3b3f1c60afecfb4db3c3619109684cb04bd60 (patch)
tree311e513af209b2fa14f0d46720801aa4e1f02462 /Lib/gzip.py
parentbpo-39396: Fix math.nextafter(-0.0, +0.0) on AIX 7.1 (GH-18094) (diff)
downloadcpython-eab3b3f1c60afecfb4db3c3619109684cb04bd60.tar.gz
cpython-eab3b3f1c60afecfb4db3c3619109684cb04bd60.tar.bz2
cpython-eab3b3f1c60afecfb4db3c3619109684cb04bd60.zip
bpo-39389: gzip: fix compression level metadata (GH-18077)
As described in RFC 1952, section 2.3.1, the XFL (eXtra FLags) byte of a gzip member header should indicate whether the DEFLATE algorithm was tuned for speed or compression ratio. Prior to this patch, archives emitted by the `gzip` module always indicated maximum compression.
Diffstat (limited to 'Lib/gzip.py')
-rw-r--r--Lib/gzip.py12
1 files changed, 9 insertions, 3 deletions
diff --git a/Lib/gzip.py b/Lib/gzip.py
index e60d8ad5995..e422773b3ed 100644
--- a/Lib/gzip.py
+++ b/Lib/gzip.py
@@ -209,7 +209,7 @@ class GzipFile(_compression.BaseStream):
self.fileobj = fileobj
if self.mode == WRITE:
- self._write_gzip_header()
+ self._write_gzip_header(compresslevel)
@property
def filename(self):
@@ -236,7 +236,7 @@ class GzipFile(_compression.BaseStream):
self.bufsize = 0
self.offset = 0 # Current file offset for seek(), tell(), etc
- def _write_gzip_header(self):
+ def _write_gzip_header(self, compresslevel):
self.fileobj.write(b'\037\213') # magic header
self.fileobj.write(b'\010') # compression method
try:
@@ -257,7 +257,13 @@ class GzipFile(_compression.BaseStream):
if mtime is None:
mtime = time.time()
write32u(self.fileobj, int(mtime))
- self.fileobj.write(b'\002')
+ if compresslevel == _COMPRESS_LEVEL_BEST:
+ xfl = b'\002'
+ elif compresslevel == _COMPRESS_LEVEL_FAST:
+ xfl = b'\004'
+ else:
+ xfl = b'\000'
+ self.fileobj.write(xfl)
self.fileobj.write(b'\377')
if fname:
self.fileobj.write(fname + b'\000')