summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2014-10-12 19:23:28 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2014-10-12 19:23:28 (GMT)
commit54edfb3eef77b2b6816e1790c38b39c53bfdc408 (patch)
tree3b0681af8b990213de1c916aec36833470e9201c
parent55bf20ad6e0bd9ca4c1b1a6dd7339972b4aa915e (diff)
downloadcpython-54edfb3eef77b2b6816e1790c38b39c53bfdc408.zip
cpython-54edfb3eef77b2b6816e1790c38b39c53bfdc408.tar.gz
cpython-54edfb3eef77b2b6816e1790c38b39c53bfdc408.tar.bz2
Issue #13664: GzipFile now supports non-ascii Unicode filenames.
-rw-r--r--Lib/gzip.py13
-rw-r--r--Lib/test/test_gzip.py11
-rw-r--r--Misc/NEWS2
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:
diff --git a/Misc/NEWS b/Misc/NEWS
index 6ff5fe5..bf9caab 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.