Assemble similar stuffs into a validation method
Currently, controllers have similar stuffs to validate query parameter either to limit the listing result or to make a marker starts with next to it. This patch intoduces a validation method 'get_validated_param' for those stuffs to get a pre-validated value with some parameters (e.g. default, limit) to keep the code clean. Change-Id: Ia5e939ee342bf4fb8533f1aa97419f5aad9b7fe1
This commit is contained in:
@@ -45,11 +45,9 @@ class BucketController(Controller):
|
|||||||
"""
|
"""
|
||||||
Handle GET Bucket (List Objects) request
|
Handle GET Bucket (List Objects) request
|
||||||
"""
|
"""
|
||||||
if 'max-keys' in req.params:
|
|
||||||
if req.params.get('max-keys').isdigit() is False:
|
|
||||||
raise InvalidArgument('max-keys', req.params['max-keys'])
|
|
||||||
|
|
||||||
max_keys = int(req.params.get('max-keys', CONF.max_bucket_listing))
|
max_keys = req.get_validated_param('max-keys', CONF.max_bucket_listing)
|
||||||
|
# TODO: Separate max_bucket_listing and default_bucket_listing
|
||||||
max_keys = min(max_keys, CONF.max_bucket_listing)
|
max_keys = min(max_keys, CONF.max_bucket_listing)
|
||||||
|
|
||||||
encoding_type = req.params.get('encoding-type')
|
encoding_type = req.params.get('encoding-type')
|
||||||
|
|||||||
@@ -145,20 +145,8 @@ class UploadsController(Controller):
|
|||||||
|
|
||||||
keymarker = req.params.get('key-marker', '')
|
keymarker = req.params.get('key-marker', '')
|
||||||
uploadid = req.params.get('upload-id-marker', '')
|
uploadid = req.params.get('upload-id-marker', '')
|
||||||
maxuploads = DEFAULT_MAX_UPLOADS
|
maxuploads = req.get_validated_param(
|
||||||
|
'max-uploads', DEFAULT_MAX_UPLOADS, DEFAULT_MAX_UPLOADS)
|
||||||
if 'max-uploads' in req.params:
|
|
||||||
try:
|
|
||||||
maxuploads = int(req.params['max-uploads'])
|
|
||||||
if maxuploads < 0 or DEFAULT_MAX_UPLOADS < maxuploads:
|
|
||||||
err_msg = 'Argument max-uploads must be an integer ' \
|
|
||||||
'between 0 and %d' % DEFAULT_MAX_UPLOADS
|
|
||||||
raise InvalidArgument('max-uploads', maxuploads, err_msg)
|
|
||||||
except ValueError:
|
|
||||||
err_msg = 'Provided max-uploads not an integer or within ' \
|
|
||||||
'integer range'
|
|
||||||
raise InvalidArgument('max-uploads', req.params['max-uploads'],
|
|
||||||
err_msg)
|
|
||||||
|
|
||||||
query = {
|
query = {
|
||||||
'format': 'json',
|
'format': 'json',
|
||||||
@@ -296,39 +284,10 @@ class UploadController(Controller):
|
|||||||
upload_id = req.params['uploadId']
|
upload_id = req.params['uploadId']
|
||||||
_check_upload_info(req, self.app, upload_id)
|
_check_upload_info(req, self.app, upload_id)
|
||||||
|
|
||||||
maxparts = DEFAULT_MAX_PARTS
|
maxparts = req.get_validated_param(
|
||||||
part_num_marker = 0
|
'max-parts', DEFAULT_MAX_PARTS, CONF.max_parts)
|
||||||
|
part_num_marker = req.get_validated_param(
|
||||||
if 'max-parts' in req.params:
|
'part-number-marker', 0, CONF.max_parts)
|
||||||
try:
|
|
||||||
maxparts = int(req.params['max-parts'])
|
|
||||||
if maxparts < 0 or CONF.max_parts < maxparts:
|
|
||||||
err_msg = 'Argument max-parts must be an integer between 0 and' \
|
|
||||||
' %d' % CONF.max_parts
|
|
||||||
raise InvalidArgument('max-parts',
|
|
||||||
req.params['max-parts'],
|
|
||||||
err_msg)
|
|
||||||
except ValueError:
|
|
||||||
err_msg = 'Provided max-parts not an integer or within ' \
|
|
||||||
'integer range'
|
|
||||||
raise InvalidArgument('max-parts', req.params['max-parts'],
|
|
||||||
err_msg)
|
|
||||||
|
|
||||||
if 'part-number-marker' in req.params:
|
|
||||||
try:
|
|
||||||
part_num_marker = int(req.params['part-number-marker'])
|
|
||||||
if part_num_marker < 0 or CONF.max_parts < part_num_marker:
|
|
||||||
err_msg = 'Argument part-number-marker must be an integer ' \
|
|
||||||
'between 0 and %d' % CONF.max_parts
|
|
||||||
raise InvalidArgument('part-number-marker',
|
|
||||||
req.params['part-number-marker'],
|
|
||||||
err_msg)
|
|
||||||
except ValueError:
|
|
||||||
err_msg = 'Provided part-number-marker not an integer or ' \
|
|
||||||
'within integer range'
|
|
||||||
raise InvalidArgument('part-number-marker',
|
|
||||||
req.params['part-number-marker'],
|
|
||||||
err_msg)
|
|
||||||
|
|
||||||
query = {
|
query = {
|
||||||
'format': 'json',
|
'format': 'json',
|
||||||
|
|||||||
@@ -652,6 +652,24 @@ class Request(swob.Request):
|
|||||||
return self._get_response(app, method, container, obj,
|
return self._get_response(app, method, container, obj,
|
||||||
headers, body, query)
|
headers, body, query)
|
||||||
|
|
||||||
|
def get_validated_param(self, param, default, limit=None):
|
||||||
|
value = default
|
||||||
|
if param in self.params:
|
||||||
|
try:
|
||||||
|
value = int(self.params[param])
|
||||||
|
if value < 0 or (limit is not None and limit < value):
|
||||||
|
err_msg = 'Argument %s must be an integer between 0 and' \
|
||||||
|
' %d' % (param, limit)
|
||||||
|
raise InvalidArgument(param,
|
||||||
|
self.params[param],
|
||||||
|
err_msg)
|
||||||
|
except ValueError:
|
||||||
|
err_msg = 'Provided %s not an integer or within ' \
|
||||||
|
'integer range' % param
|
||||||
|
raise InvalidArgument(param, self.params[param],
|
||||||
|
err_msg)
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
class S3AclRequest(Request):
|
class S3AclRequest(Request):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ from swift3.test.unit.test_middleware import Swift3TestCase
|
|||||||
from swift3.cfg import CONF
|
from swift3.cfg import CONF
|
||||||
from swift3.request import Request as S3_Request
|
from swift3.request import Request as S3_Request
|
||||||
from swift3.request import S3AclRequest
|
from swift3.request import S3AclRequest
|
||||||
|
from swift3.response import InvalidArgument
|
||||||
|
|
||||||
|
|
||||||
Fake_ACL_MAP = {
|
Fake_ACL_MAP = {
|
||||||
@@ -160,6 +161,24 @@ class TestRequest(Swift3TestCase):
|
|||||||
permission = args[1]
|
permission = args[1]
|
||||||
self.assertEqual(permission, 'READ')
|
self.assertEqual(permission, 'READ')
|
||||||
|
|
||||||
|
def test_get_validate_param(self):
|
||||||
|
def create_s3request_with_param(param, value):
|
||||||
|
req = Request.blank(
|
||||||
|
'/bucket?%s=%s' % (param, value),
|
||||||
|
environ={'REQUEST_METHOD': 'GET'},
|
||||||
|
headers={'Authorization': 'AWS test:tester:hmac'})
|
||||||
|
return S3_Request(req.environ, True)
|
||||||
|
|
||||||
|
s3req = create_s3request_with_param('max-keys', '1')
|
||||||
|
|
||||||
|
# a param in the range
|
||||||
|
self.assertEquals(s3req.get_validated_param('max-keys', 1000, 1000), 1)
|
||||||
|
self.assertEquals(s3req.get_validated_param('max-keys', 0, 1), 1)
|
||||||
|
|
||||||
|
# a param in the out of the range
|
||||||
|
with self.assertRaises(InvalidArgument):
|
||||||
|
s3req.get_validated_param('max-keys', 0, 0)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
Reference in New Issue
Block a user