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:
Colton Leekley-Winslow
2015-04-13 16:42:09 -04:00
parent 9dc3d87259
commit 1846d1d476
2 changed files with 28 additions and 17 deletions

View File

@@ -343,6 +343,9 @@ class Request(object):
value = self.env['HTTP_RANGE']
if value.startswith('bytes='):
value = value[6:]
else:
msg = "The value must be prefixed with 'bytes='"
raise HTTPInvalidHeader(msg, 'Range')
except KeyError:
return None

View File

@@ -368,15 +368,15 @@ class TestReqVars(testing.TestBase):
self.assertEqual(preferred_type, None)
def test_range(self):
headers = {'Range': '10-'}
headers = {'Range': 'bytes=10-'}
req = Request(testing.create_environ(headers=headers))
self.assertEqual(req.range, (10, -1))
headers = {'Range': '10-20'}
headers = {'Range': 'bytes=10-20'}
req = Request(testing.create_environ(headers=headers))
self.assertEqual(req.range, (10, 20))
headers = {'Range': '-10240'}
headers = {'Range': 'bytes=-10240'}
req = Request(testing.create_environ(headers=headers))
self.assertEqual(req.range, (-10240, -1))
@@ -392,62 +392,62 @@ class TestReqVars(testing.TestBase):
self.assertIs(req.range, None)
def test_range_invalid(self):
headers = {'Range': '10240'}
headers = {'Range': 'bytes=10240'}
req = Request(testing.create_environ(headers=headers))
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
headers = {'Range': '-'}
headers = {'Range': 'bytes=-'}
expected_desc = ('The value provided for the Range header is '
'invalid. The byte offsets are missing.')
self._test_error_details(headers, 'range',
falcon.HTTPInvalidHeader,
'Invalid header value', expected_desc)
headers = {'Range': '--'}
headers = {'Range': 'bytes=--'}
req = Request(testing.create_environ(headers=headers))
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
headers = {'Range': '-3-'}
headers = {'Range': 'bytes=-3-'}
req = Request(testing.create_environ(headers=headers))
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
headers = {'Range': '-3-4'}
headers = {'Range': 'bytes=-3-4'}
req = Request(testing.create_environ(headers=headers))
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))
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
headers = {'Range': '3-3-'}
headers = {'Range': 'bytes=3-3-'}
req = Request(testing.create_environ(headers=headers))
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
headers = {'Range': '3-3- '}
headers = {'Range': 'bytes=3-3- '}
req = Request(testing.create_environ(headers=headers))
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
headers = {'Range': 'fizbit'}
headers = {'Range': 'bytes=fizbit'}
req = Request(testing.create_environ(headers=headers))
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
headers = {'Range': 'a-'}
headers = {'Range': 'bytes=a-'}
req = Request(testing.create_environ(headers=headers))
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
headers = {'Range': 'a-3'}
headers = {'Range': 'bytes=a-3'}
req = Request(testing.create_environ(headers=headers))
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
headers = {'Range': '-b'}
headers = {'Range': 'bytes=-b'}
req = Request(testing.create_environ(headers=headers))
self.assertRaises(falcon.HTTPBadRequest, lambda: req.range)
headers = {'Range': '3-b'}
headers = {'Range': 'bytes=3-b'}
req = Request(testing.create_environ(headers=headers))
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 '
'invalid. It must be a byte range formatted '
'according to RFC 2616.')
@@ -463,6 +463,14 @@ class TestReqVars(testing.TestBase):
falcon.HTTPInvalidHeader,
'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):
req = Request(testing.create_environ())
self.assertEqual(req.range, None)