1f4e88
From c52e1b7388c17466a551391cdf81964bf0b7aef0 Mon Sep 17 00:00:00 2001
1f4e88
From: ThiefMaster <adrian@planetcoding.net>
1f4e88
Date: Thu, 23 Nov 2017 10:32:13 +0100
1f4e88
Subject: [PATCH 2/3] Fix ValueError for some invalid Range requests
1f4e88
1f4e88
fixes #2526
1f4e88
---
1f4e88
 CHANGES               |  8 ++++++++
1f4e88
 flask/helpers.py      |  3 ++-
1f4e88
 tests/test_helpers.py | 21 ++++++++++++++++++++-
1f4e88
 3 files changed, 30 insertions(+), 2 deletions(-)
1f4e88
1f4e88
diff --git a/CHANGES b/CHANGES
1f4e88
index 3456276a..b32b98cb 100644
1f4e88
--- a/CHANGES
1f4e88
+++ b/CHANGES
1f4e88
@@ -15,6 +15,14 @@ Major release, unreleased
1f4e88
   method returns compressed response by default, and pretty response in
1f4e88
   debug mode.
1f4e88
 
1f4e88
+Version 0.12.3
1f4e88
+--------------
1f4e88
+
1f4e88
+Bugfix release, unreleased
1f4e88
+
1f4e88
+- Fix a ValueError caused by invalid Range requests in some cases
1f4e88
+
1f4e88
+
1f4e88
 Version 0.12.2
1f4e88
 --------------
1f4e88
 
1f4e88
diff --git a/flask/helpers.py b/flask/helpers.py
1f4e88
index 4bb1d1c9..caaad9a3 100644
1f4e88
--- a/flask/helpers.py
1f4e88
+++ b/flask/helpers.py
1f4e88
@@ -591,7 +591,8 @@ def send_file(filename_or_fp, mimetype=None, as_attachment=False,
1f4e88
                 rv = rv.make_conditional(request, accept_ranges=True,
1f4e88
                                          complete_length=fsize)
1f4e88
             except RequestedRangeNotSatisfiable:
1f4e88
-                file.close()
1f4e88
+                if file is not None:
1f4e88
+                    file.close()
1f4e88
                 raise
1f4e88
         else:
1f4e88
             rv = rv.make_conditional(request)
1f4e88
diff --git a/tests/test_helpers.py b/tests/test_helpers.py
1f4e88
index 9320ef71..69350751 100644
1f4e88
--- a/tests/test_helpers.py
1f4e88
+++ b/tests/test_helpers.py
1f4e88
@@ -468,7 +468,7 @@ class TestSendfile(object):
1f4e88
 
1f4e88
     @pytest.mark.skipif(
1f4e88
         not callable(getattr(Range, 'to_content_range_header', None)),
1f4e88
-        reason="not implement within werkzeug"
1f4e88
+        reason="not implemented within werkzeug"
1f4e88
     )
1f4e88
     def test_send_file_range_request(self):
1f4e88
         app = flask.Flask(__name__)
1f4e88
@@ -529,6 +529,25 @@ class TestSendfile(object):
1f4e88
         assert rv.status_code == 200
1f4e88
         rv.close()
1f4e88
 
1f4e88
+    @pytest.mark.skipif(
1f4e88
+        not callable(getattr(Range, 'to_content_range_header', None)),
1f4e88
+        reason="not implemented within werkzeug"
1f4e88
+    )
1f4e88
+    def test_send_file_range_request_xsendfile_invalid(self):
1f4e88
+        # https://github.com/pallets/flask/issues/2526
1f4e88
+        app = flask.Flask(__name__)
1f4e88
+        app.use_x_sendfile = True
1f4e88
+
1f4e88
+        @app.route('/')
1f4e88
+        def index():
1f4e88
+            return flask.send_file('static/index.html', conditional=True)
1f4e88
+
1f4e88
+        c = app.test_client()
1f4e88
+
1f4e88
+        rv = c.get('/', headers={'Range': 'bytes=1000-'})
1f4e88
+        assert rv.status_code == 416
1f4e88
+        rv.close()
1f4e88
+
1f4e88
     def test_attachment(self):
1f4e88
         app = flask.Flask(__name__)
1f4e88
         with app.test_request_context():
1f4e88
-- 
1f4e88
2.21.0
1f4e88