diff --git a/CHANGES b/CHANGES index 33926de9..fbf86829 100644 --- a/CHANGES +++ b/CHANGES @@ -32,6 +32,7 @@ Version 0.10.2 - Fixed an issue with query parameters getting removed from requests in the test client when absolute URLs were requested. - Made `@before_first_request` into a decorator as intended. +- Fixed an etags bug when sending a file streams with a name. Version 0.10.1 -------------- diff --git a/flask/helpers.py b/flask/helpers.py index e55a42d6..90c2d473 100644 --- a/flask/helpers.py +++ b/flask/helpers.py @@ -538,14 +538,19 @@ def send_file(filename_or_fp, mimetype=None, as_attachment=False, rv.expires = int(time() + cache_timeout) if add_etags and filename is not None: - rv.set_etag('flask-%s-%s-%s' % ( - os.path.getmtime(filename), - os.path.getsize(filename), - adler32( - filename.encode('utf-8') if isinstance(filename, text_type) - else filename - ) & 0xffffffff - )) + try: + rv.set_etag('flask-%s-%s-%s' % ( + os.path.getmtime(filename), + os.path.getsize(filename), + adler32( + filename.encode('utf-8') if isinstance(filename, text_type) + else filename + ) & 0xffffffff + )) + except OSError: + warn('Access %s failed, maybe it does not exist, so ignore etags in ' + 'headers' % filename, stacklevel=2) + if conditional: rv = rv.make_conditional(request) # make sure we don't send x-sendfile for servers that diff --git a/flask/testsuite/helpers.py b/flask/testsuite/helpers.py index f8460d3c..549f67fa 100644 --- a/flask/testsuite/helpers.py +++ b/flask/testsuite/helpers.py @@ -303,6 +303,18 @@ class SendfileTestCase(FlaskTestCase): rv.close() # etags self.assert_equal(len(captured), 1) + with catch_warnings() as captured: + class PyStringIO(StringIO): + pass + f = PyStringIO('Test') + f.name = 'test.txt' + rv = flask.send_file(f) + rv.direct_passthrough = False + self.assert_equal(rv.data, b'Test') + self.assert_equal(rv.mimetype, 'text/plain') + rv.close() + # attachment_filename and etags + self.assert_equal(len(captured), 3) with catch_warnings() as captured: f = StringIO('Test') rv = flask.send_file(f, mimetype='text/plain') diff --git a/flask/testsuite/testing.py b/flask/testsuite/testing.py index de78746b..11ab763b 100644 --- a/flask/testsuite/testing.py +++ b/flask/testsuite/testing.py @@ -207,8 +207,8 @@ class TestToolsTestCase(FlaskTestCase): with app.test_client() as c: rv = c.post('http://domain.com/action?vodka=42', data={'gin': 43}) self.assert_equal(rv.status_code, 200) - self.assert_('gin' in flask.request.form) - self.assert_('vodka' in flask.request.args) + self.assert_true('gin' in flask.request.form) + self.assert_true('vodka' in flask.request.args) class SubdomainTestCase(FlaskTestCase):