fix(request.range): Require bytes prefix for range
The range attribute of the Request object now requires that the value be prefix with 'bytes=' Fix #387 This will be incompatible with previous code that did not prefix the range value with 'bytes=' remove strip()
This commit is contained in:
@@ -343,6 +343,9 @@ class Request(object):
|
|||||||
value = self.env['HTTP_RANGE']
|
value = self.env['HTTP_RANGE']
|
||||||
if value.startswith('bytes='):
|
if value.startswith('bytes='):
|
||||||
value = value[6:]
|
value = value[6:]
|
||||||
|
else:
|
||||||
|
msg = "The value must be prefixed with 'bytes='"
|
||||||
|
raise HTTPInvalidHeader(msg, 'Range')
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
@@ -368,15 +368,15 @@ class TestReqVars(testing.TestBase):
|
|||||||
self.assertEqual(preferred_type, None)
|
self.assertEqual(preferred_type, None)
|
||||||
|
|
||||||
def test_range(self):
|
def test_range(self):
|
||||||
headers = {'Range': '10-'}
|
headers = {'Range': 'bytes=10-'}
|
||||||
req = Request(testing.create_environ(headers=headers))
|
req = Request(testing.create_environ(headers=headers))
|
||||||
self.assertEqual(req.range, (10, -1))
|
self.assertEqual(req.range, (10, -1))
|
||||||
|
|
||||||
headers = {'Range': '10-20'}
|
headers = {'Range': 'bytes=10-20'}
|
||||||
req = Request(testing.create_environ(headers=headers))
|
req = Request(testing.create_environ(headers=headers))
|
||||||
self.assertEqual(req.range, (10, 20))
|
self.assertEqual(req.range, (10, 20))
|
||||||
|
|
||||||
headers = {'Range': '-10240'}
|
headers = {'Range': 'bytes=-10240'}
|
||||||
req = Request(testing.create_environ(headers=headers))
|
req = Request(testing.create_environ(headers=headers))
|
||||||
self.assertEqual(req.range, (-10240, -1))
|
self.assertEqual(req.range, (-10240, -1))
|
||||||
|
|
||||||
@@ -392,62 +392,62 @@ class TestReqVars(testing.TestBase):
|
|||||||
self.assertIs(req.range, None)
|
self.assertIs(req.range, None)
|
||||||
|
|
||||||
def test_range_invalid(self):
|
def test_range_invalid(self):
|
||||||
headers = {'Range': '10240'}
|
headers = {'Range': 'bytes=10240'}
|
||||||
req = Request(testing.create_environ(headers=headers))
|
req = Request(testing.create_environ(headers=headers))
|
||||||
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
||||||
|
|
||||||
headers = {'Range': '-'}
|
headers = {'Range': 'bytes=-'}
|
||||||
expected_desc = ('The value provided for the Range header is '
|
expected_desc = ('The value provided for the Range header is '
|
||||||
'invalid. The byte offsets are missing.')
|
'invalid. The byte offsets are missing.')
|
||||||
self._test_error_details(headers, 'range',
|
self._test_error_details(headers, 'range',
|
||||||
falcon.HTTPInvalidHeader,
|
falcon.HTTPInvalidHeader,
|
||||||
'Invalid header value', expected_desc)
|
'Invalid header value', expected_desc)
|
||||||
|
|
||||||
headers = {'Range': '--'}
|
headers = {'Range': 'bytes=--'}
|
||||||
req = Request(testing.create_environ(headers=headers))
|
req = Request(testing.create_environ(headers=headers))
|
||||||
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
||||||
|
|
||||||
headers = {'Range': '-3-'}
|
headers = {'Range': 'bytes=-3-'}
|
||||||
req = Request(testing.create_environ(headers=headers))
|
req = Request(testing.create_environ(headers=headers))
|
||||||
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
||||||
|
|
||||||
headers = {'Range': '-3-4'}
|
headers = {'Range': 'bytes=-3-4'}
|
||||||
req = Request(testing.create_environ(headers=headers))
|
req = Request(testing.create_environ(headers=headers))
|
||||||
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
||||||
|
|
||||||
headers = {'Range': '3-3-4'}
|
headers = {'Range': 'bytes=3-3-4'}
|
||||||
req = Request(testing.create_environ(headers=headers))
|
req = Request(testing.create_environ(headers=headers))
|
||||||
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
||||||
|
|
||||||
headers = {'Range': '3-3-'}
|
headers = {'Range': 'bytes=3-3-'}
|
||||||
req = Request(testing.create_environ(headers=headers))
|
req = Request(testing.create_environ(headers=headers))
|
||||||
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
||||||
|
|
||||||
headers = {'Range': '3-3- '}
|
headers = {'Range': 'bytes=3-3- '}
|
||||||
req = Request(testing.create_environ(headers=headers))
|
req = Request(testing.create_environ(headers=headers))
|
||||||
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
||||||
|
|
||||||
headers = {'Range': 'fizbit'}
|
headers = {'Range': 'bytes=fizbit'}
|
||||||
req = Request(testing.create_environ(headers=headers))
|
req = Request(testing.create_environ(headers=headers))
|
||||||
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
||||||
|
|
||||||
headers = {'Range': 'a-'}
|
headers = {'Range': 'bytes=a-'}
|
||||||
req = Request(testing.create_environ(headers=headers))
|
req = Request(testing.create_environ(headers=headers))
|
||||||
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
||||||
|
|
||||||
headers = {'Range': 'a-3'}
|
headers = {'Range': 'bytes=a-3'}
|
||||||
req = Request(testing.create_environ(headers=headers))
|
req = Request(testing.create_environ(headers=headers))
|
||||||
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
||||||
|
|
||||||
headers = {'Range': '-b'}
|
headers = {'Range': 'bytes=-b'}
|
||||||
req = Request(testing.create_environ(headers=headers))
|
req = Request(testing.create_environ(headers=headers))
|
||||||
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
||||||
|
|
||||||
headers = {'Range': '3-b'}
|
headers = {'Range': 'bytes=3-b'}
|
||||||
req = Request(testing.create_environ(headers=headers))
|
req = Request(testing.create_environ(headers=headers))
|
||||||
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
|
||||||
|
|
||||||
headers = {'Range': 'x-y'}
|
headers = {'Range': 'bytes=x-y'}
|
||||||
expected_desc = ('The value provided for the Range header is '
|
expected_desc = ('The value provided for the Range header is '
|
||||||
'invalid. It must be a byte range formatted '
|
'invalid. It must be a byte range formatted '
|
||||||
'according to RFC 2616.')
|
'according to RFC 2616.')
|
||||||
@@ -463,6 +463,14 @@ class TestReqVars(testing.TestBase):
|
|||||||
falcon.HTTPInvalidHeader,
|
falcon.HTTPInvalidHeader,
|
||||||
'Invalid header value', expected_desc)
|
'Invalid header value', expected_desc)
|
||||||
|
|
||||||
|
headers = {'Range': '10-'}
|
||||||
|
expected_desc = ("The value provided for the Range "
|
||||||
|
"header is invalid. The value must be "
|
||||||
|
"prefixed with 'bytes='")
|
||||||
|
self._test_error_details(headers, 'range',
|
||||||
|
falcon.HTTPInvalidHeader,
|
||||||
|
'Invalid header value', expected_desc)
|
||||||
|
|
||||||
def test_missing_attribute_header(self):
|
def test_missing_attribute_header(self):
|
||||||
req = Request(testing.create_environ())
|
req = Request(testing.create_environ())
|
||||||
self.assertEqual(req.range, None)
|
self.assertEqual(req.range, None)
|
||||||
|
|||||||
Reference in New Issue
Block a user