Browse Source

style cleanup

break out header parts in test
test for no filename* parameter for ascii header
pull/2223/head
David Lord 8 years ago
parent
commit
c1973016ea
No known key found for this signature in database
GPG Key ID: 7A1C87E3F5BC42A8
  1. 19
      flask/helpers.py
  2. 23
      tests/test_helpers.py

19
flask/helpers.py

@ -14,10 +14,10 @@ import sys
import pkgutil
import posixpath
import mimetypes
from unicodedata import normalize
from time import time
from zlib import adler32
from threading import RLock
import unicodedata
from werkzeug.routing import BuildError
from functools import update_wrapper
@ -479,6 +479,11 @@ def send_file(filename_or_fp, mimetype=None, as_attachment=False,
The `attachment_filename` is preferred over `filename` for MIME-type
detection.
.. versionchanged:: 0.13
UTF-8 filenames, as specified in `RFC 2231`_, are supported.
.. _RFC 2231: https://tools.ietf.org/html/rfc2231#section-4
:param filename_or_fp: the filename of the file to send in `latin-1`.
This is relative to the :attr:`~Flask.root_path`
if a relative path is specified.
@ -535,7 +540,10 @@ def send_file(filename_or_fp, mimetype=None, as_attachment=False,
if attachment_filename is None:
raise TypeError('filename unavailable, required for '
'sending as attachment')
normalized = normalize('NFKD', text_type(attachment_filename))
normalized = unicodedata.normalize(
'NFKD', text_type(attachment_filename)
)
try:
normalized.encode('ascii')
@ -545,12 +553,9 @@ def send_file(filename_or_fp, mimetype=None, as_attachment=False,
'filename*': "UTF-8''%s" % url_quote(attachment_filename),
}
else:
filenames = {
'filename': attachment_filename,
}
filenames = {'filename': attachment_filename}
headers.add('Content-Disposition', 'attachment',
**filenames)
headers.add('Content-Disposition', 'attachment', **filenames)
if current_app.use_x_sendfile and filename:
if file is not None:

23
tests/test_helpers.py

@ -540,10 +540,11 @@ class TestSendfile(object):
value, options = \
parse_options_header(rv.headers['Content-Disposition'])
assert value == 'attachment'
assert options['filename'] == 'index.html'
assert 'filename*' not in options
rv.close()
with app.test_request_context():
assert options['filename'] == 'index.html'
rv = flask.send_file('static/index.html', as_attachment=True)
value, options = parse_options_header(rv.headers['Content-Disposition'])
assert value == 'attachment'
@ -562,16 +563,22 @@ class TestSendfile(object):
def test_attachment_with_utf8_filename(self):
app = flask.Flask(__name__)
with app.test_request_context():
with open(os.path.join(app.root_path, 'static/index.html')) as f:
rv = flask.send_file(f, as_attachment=True,
attachment_filename=u'Ñandú/pingüino.txt')
content_disposition = set(rv.headers['Content-Disposition'].split(';'))
assert content_disposition == set(['attachment',
' filename="Nandu/pinguino.txt"',
" filename*=UTF-8''%C3%91and%C3%BA%EF%BC%8Fping%C3%BCino.txt"])
rv = flask.send_file(
'static/index.html', as_attachment=True,
attachment_filename=u'Ñandú/pingüino.txt'
)
value, options = parse_options_header(
rv.headers['Content-Disposition']
)
rv.close()
assert value == 'attachment'
assert sorted(options.keys()) == ('filename', 'filename*')
assert options['filename'] == 'Nandu/pinguino.txt'
assert options['filename*'] == 'UTF-8''%C3%91and%C3%BA%EF%BC%8Fping%C3%BCino.txt'
def test_static_file(self):
app = flask.Flask(__name__)
# default cache timeout is 12 hours

Loading…
Cancel
Save