Commit c6cd5a3a authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #13664: GzipFile now supports non-ascii Unicode filenames.

parent 05cfcc6f
......@@ -164,9 +164,16 @@ class GzipFile(io.BufferedIOBase):
def _write_gzip_header(self):
self.fileobj.write('\037\213') # magic header
self.fileobj.write('\010') # compression method
fname = os.path.basename(self.name)
if fname.endswith(".gz"):
fname = fname[:-3]
try:
# RFC 1952 requires the FNAME field to be Latin-1. Do not
# include filenames that cannot be represented that way.
fname = os.path.basename(self.name)
if not isinstance(fname, str):
fname = fname.encode('latin-1')
if fname.endswith('.gz'):
fname = fname[:-3]
except UnicodeEncodeError:
fname = ''
flags = 0
if fname:
flags = FNAME
......
......@@ -30,6 +30,17 @@ class TestGzip(unittest.TestCase):
def tearDown(self):
test_support.unlink(self.filename)
@test_support.requires_unicode
def test_unicode_filename(self):
unicode_filename = test_support.TESTFN_UNICODE
with gzip.GzipFile(unicode_filename, "wb") as f:
f.write(data1 * 50)
with gzip.GzipFile(unicode_filename, "rb") as f:
self.assertEqual(f.read(), data1 * 50)
# Sanity check that we are actually operating on the right file.
with open(unicode_filename, 'rb') as fobj, \
gzip.GzipFile(fileobj=fobj, mode="rb") as f:
self.assertEqual(f.read(), data1 * 50)
def test_write(self):
with gzip.GzipFile(self.filename, 'wb') as f:
......
......@@ -37,6 +37,8 @@ Core and Builtins
Library
-------
- Issue #13664: GzipFile now supports non-ascii Unicode filenames.
- Issue #13096: Fixed segfault in CTypes POINTER handling of large
values.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment