diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2014-10-12 19:23:28 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2014-10-12 19:23:28 (GMT) |
commit | 54edfb3eef77b2b6816e1790c38b39c53bfdc408 (patch) | |
tree | 3b0681af8b990213de1c916aec36833470e9201c | |
parent | 55bf20ad6e0bd9ca4c1b1a6dd7339972b4aa915e (diff) | |
download | cpython-54edfb3eef77b2b6816e1790c38b39c53bfdc408.zip cpython-54edfb3eef77b2b6816e1790c38b39c53bfdc408.tar.gz cpython-54edfb3eef77b2b6816e1790c38b39c53bfdc408.tar.bz2 |
Issue #13664: GzipFile now supports non-ascii Unicode filenames.
-rw-r--r-- | Lib/gzip.py | 13 | ||||
-rw-r--r-- | Lib/test/test_gzip.py | 11 | ||||
-rw-r--r-- | Misc/NEWS | 2 |
3 files changed, 23 insertions, 3 deletions
diff --git a/Lib/gzip.py b/Lib/gzip.py index a613bae..49566fd 100644 --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -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 diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py index aa56ed3..9713061 100644 --- a/Lib/test/test_gzip.py +++ b/Lib/test/test_gzip.py @@ -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. |