Merge pull request #3273 from pallets/utf8-filename

send_file quotes ":/" in UTF-8 filename
This commit is contained in:
David Lord 2019-06-27 08:04:31 -07:00 committed by GitHub
commit 2675076cb7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 5 additions and 1 deletions

View File

@ -8,6 +8,8 @@ Unreleased
- The key information for ``BadRequestKeyError`` is no longer cleared
outside debug mode, so error handlers can still access it. This
requires upgrading to Werkzeug 0.15.5. :issue:`3249`
- ``send_file`` url quotes the ":" and "/" characters for more
compatible UTF-8 filename support in some browsers. :issue:`3074`
Version 1.0.3

View File

@ -576,7 +576,7 @@ def send_file(filename_or_fp, mimetype=None, as_attachment=False,
filenames = {
'filename': unicodedata.normalize(
'NFKD', attachment_filename).encode('ascii', 'ignore'),
'filename*': "UTF-8''%s" % url_quote(attachment_filename),
'filename*': "UTF-8''%s" % url_quote(attachment_filename, safe=b""),
}
else:
filenames = {'filename': attachment_filename}

View File

@ -646,6 +646,8 @@ class TestSendfile(object):
(u'Vögel.txt', 'Vogel.txt', 'V%C3%B6gel.txt'),
# Native string not marked as Unicode on Python 2
('tést.txt', 'test.txt', 't%C3%A9st.txt'),
# ":/" are not safe in filename* value
(u"те:/ст", '":/"', "%D1%82%D0%B5%3A%2F%D1%81%D1%82"),
))
def test_attachment_filename_encoding(self, filename, ascii, utf8):
rv = flask.send_file('static/index.html', as_attachment=True, attachment_filename=filename)