Return name of header larger than MAX_HEADER_SIZE
Change-Id: I3130d8f8f0beebc8f92600f76b72cf64a3f12894
This commit is contained in:
parent
3748b54a1b
commit
b7187cecee
@ -80,7 +80,9 @@ def check_metadata(req, target_type):
|
|||||||
meta_size = 0
|
meta_size = 0
|
||||||
for key, value in req.headers.iteritems():
|
for key, value in req.headers.iteritems():
|
||||||
if isinstance(value, basestring) and len(value) > MAX_HEADER_SIZE:
|
if isinstance(value, basestring) and len(value) > MAX_HEADER_SIZE:
|
||||||
return HTTPBadRequest('Header Line Too Long')
|
return HTTPBadRequest(body='Header value too long: %s' %
|
||||||
|
key[:MAX_META_NAME_LENGTH],
|
||||||
|
request=req, content_type='text/plain')
|
||||||
if not key.lower().startswith(prefix):
|
if not key.lower().startswith(prefix):
|
||||||
continue
|
continue
|
||||||
key = key[len(prefix):]
|
key = key[len(prefix):]
|
||||||
@ -91,11 +93,12 @@ def check_metadata(req, target_type):
|
|||||||
meta_size += len(key) + len(value)
|
meta_size += len(key) + len(value)
|
||||||
if len(key) > MAX_META_NAME_LENGTH:
|
if len(key) > MAX_META_NAME_LENGTH:
|
||||||
return HTTPBadRequest(
|
return HTTPBadRequest(
|
||||||
body='Metadata name too long; max %d' % MAX_META_NAME_LENGTH,
|
body='Metadata name too long: %s%s' % (prefix, key),
|
||||||
request=req, content_type='text/plain')
|
request=req, content_type='text/plain')
|
||||||
elif len(value) > MAX_META_VALUE_LENGTH:
|
elif len(value) > MAX_META_VALUE_LENGTH:
|
||||||
return HTTPBadRequest(
|
return HTTPBadRequest(
|
||||||
body='Metadata value too long; max %d' % MAX_META_VALUE_LENGTH,
|
body='Metadata value longer than %d: %s%s' % (
|
||||||
|
MAX_META_VALUE_LENGTH, prefix, key),
|
||||||
request=req, content_type='text/plain')
|
request=req, content_type='text/plain')
|
||||||
elif meta_count > MAX_META_COUNT:
|
elif meta_count > MAX_META_COUNT:
|
||||||
return HTTPBadRequest(
|
return HTTPBadRequest(
|
||||||
|
@ -26,6 +26,13 @@ from swift.common import constraints
|
|||||||
|
|
||||||
class TestConstraints(unittest.TestCase):
|
class TestConstraints(unittest.TestCase):
|
||||||
|
|
||||||
|
def assertIn(self, member, container, msg=None):
|
||||||
|
"""Copied from 2.7"""
|
||||||
|
if member not in container:
|
||||||
|
standardMsg = '%s not found in %s' % (safe_repr(member),
|
||||||
|
safe_repr(container))
|
||||||
|
self.fail(self._formatMessage(msg, standardMsg))
|
||||||
|
|
||||||
def test_check_metadata_empty(self):
|
def test_check_metadata_empty(self):
|
||||||
headers = {}
|
headers = {}
|
||||||
self.assertEquals(constraints.check_metadata(Request.blank('/',
|
self.assertEquals(constraints.check_metadata(Request.blank('/',
|
||||||
@ -50,6 +57,9 @@ class TestConstraints(unittest.TestCase):
|
|||||||
headers = {'X-Object-Meta-%s' % name: 'v'}
|
headers = {'X-Object-Meta-%s' % name: 'v'}
|
||||||
self.assertEquals(constraints.check_metadata(Request.blank('/',
|
self.assertEquals(constraints.check_metadata(Request.blank('/',
|
||||||
headers=headers), 'object').status_int, HTTP_BAD_REQUEST)
|
headers=headers), 'object').status_int, HTTP_BAD_REQUEST)
|
||||||
|
self.assertIn(('X-Object-Meta-%s' % name).lower(),
|
||||||
|
constraints.check_metadata(Request.blank('/', headers=headers),
|
||||||
|
'object').body.lower())
|
||||||
|
|
||||||
def test_check_metadata_value_length(self):
|
def test_check_metadata_value_length(self):
|
||||||
value = 'a' * constraints.MAX_META_VALUE_LENGTH
|
value = 'a' * constraints.MAX_META_VALUE_LENGTH
|
||||||
@ -60,6 +70,12 @@ class TestConstraints(unittest.TestCase):
|
|||||||
headers = {'X-Object-Meta-Name': value}
|
headers = {'X-Object-Meta-Name': value}
|
||||||
self.assertEquals(constraints.check_metadata(Request.blank('/',
|
self.assertEquals(constraints.check_metadata(Request.blank('/',
|
||||||
headers=headers), 'object').status_int, HTTP_BAD_REQUEST)
|
headers=headers), 'object').status_int, HTTP_BAD_REQUEST)
|
||||||
|
self.assertIn('x-object-meta-name',
|
||||||
|
constraints.check_metadata(Request.blank('/', headers=headers),
|
||||||
|
'object').body.lower())
|
||||||
|
self.assertIn(str(constraints.MAX_META_VALUE_LENGTH),
|
||||||
|
constraints.check_metadata(Request.blank('/', headers=headers),
|
||||||
|
'object').body)
|
||||||
|
|
||||||
def test_check_metadata_count(self):
|
def test_check_metadata_count(self):
|
||||||
headers = {}
|
headers = {}
|
||||||
@ -210,6 +226,8 @@ class TestConstraints(unittest.TestCase):
|
|||||||
'ab' * constraints.MAX_HEADER_SIZE})
|
'ab' * constraints.MAX_HEADER_SIZE})
|
||||||
self.assertEquals(constraints.check_metadata(req, 'object').status_int,
|
self.assertEquals(constraints.check_metadata(req, 'object').status_int,
|
||||||
HTTP_BAD_REQUEST)
|
HTTP_BAD_REQUEST)
|
||||||
|
self.assertIn('x-object-meta-hello', constraints.check_metadata(req,
|
||||||
|
'object').body.lower())
|
||||||
|
|
||||||
def test_validate_constraints(self):
|
def test_validate_constraints(self):
|
||||||
c = constraints
|
c = constraints
|
||||||
|
Loading…
Reference in New Issue
Block a user