From 5bf16193e796f6770eb3d785e1782d3b009725c7 Mon Sep 17 00:00:00 2001 From: Flavio Percoco Date: Tue, 2 Sep 2014 13:40:09 +0200 Subject: [PATCH] Make Client-ID a required header It was decided to make Client-ID a required header. This patch adds a new `before hook` that enforces this new rule. Partially-Implements blueprint: api-v1.1-header-changes Change-Id: I7b20d56812a0dff4f8ed3e6da75b62ef7c0f307e --- tests/functional/wsgi/v1_1/test_queues.py | 3 ++- zaqar/common/transport/wsgi/helpers.py | 20 +++++++++++++++++++ zaqar/queues/transport/wsgi/driver.py | 1 + .../wsgi/v1_1/test_queue_lifecycle.py | 6 ++++-- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/tests/functional/wsgi/v1_1/test_queues.py b/tests/functional/wsgi/v1_1/test_queues.py index 6d7513f54..7a58efd49 100644 --- a/tests/functional/wsgi/v1_1/test_queues.py +++ b/tests/functional/wsgi/v1_1/test_queues.py @@ -150,7 +150,8 @@ class TestInsertQueue(base.V1_1FunctionalTestBase): def test_insert_queue_header_asterisk(self): """Insert Queue with 'Accept': '*/*'.""" path = '/queues/asteriskinheader' - headers = {"Accept": '*/*', + headers = {'Accept': '*/*', + 'Client-ID': str(uuid.uuid4()), 'X-Project-ID': '518b51ea133c4facadae42c328d6b77b'} self.addCleanup(self.client.delete, url=path, headers=headers) diff --git a/zaqar/common/transport/wsgi/helpers.py b/zaqar/common/transport/wsgi/helpers.py index 71d41deff..4eaf9fa40 100644 --- a/zaqar/common/transport/wsgi/helpers.py +++ b/zaqar/common/transport/wsgi/helpers.py @@ -21,6 +21,7 @@ import six from zaqar.i18n import _ import zaqar.openstack.common.log as logging from zaqar.queues.transport import validation +from zaqar.queues.transport.wsgi import utils LOG = logging.getLogger(__name__) @@ -52,6 +53,25 @@ and retry.''')) _(u'The header X-PROJECT-ID was missing')) +def require_client_id(req, resp, params): + """Makes sure the header `Client-ID` is present in the request + + Use as a before hook. + :param req: request sent + :type req: falcon.request.Request + :param resp: response object to return + :type resp: falcon.response.Response + :param params: additional parameters passed to responders + :type params: dict + :rtype: None + """ + + if 'v1.1' in req.path: + # NOTE(flaper87): `get_client_uuid` already raises 400 + # it the header is missing. + utils.get_client_uuid(req) + + def validate_queue_identification(validate, req, resp, params): """Hook for validating the queue name and project id in requests. diff --git a/zaqar/queues/transport/wsgi/driver.py b/zaqar/queues/transport/wsgi/driver.py index 9b9a2477e..836edfd1e 100644 --- a/zaqar/queues/transport/wsgi/driver.py +++ b/zaqar/queues/transport/wsgi/driver.py @@ -64,6 +64,7 @@ class Driver(transport.DriverBase): """Exposed to facilitate unit testing.""" return [ helpers.require_accepts_json, + helpers.require_client_id, helpers.extract_project_id, # NOTE(kgriffs): Depends on project_id being extracted, above diff --git a/zaqar/tests/queues/transport/wsgi/v1_1/test_queue_lifecycle.py b/zaqar/tests/queues/transport/wsgi/v1_1/test_queue_lifecycle.py index ea133b1c3..711e803c8 100644 --- a/zaqar/tests/queues/transport/wsgi/v1_1/test_queue_lifecycle.py +++ b/zaqar/tests/queues/transport/wsgi/v1_1/test_queue_lifecycle.py @@ -233,8 +233,10 @@ class QueueLifecycleBaseTest(base.V1_1Base): def test_list(self): arbitrary_number = 644079696574693 project_id = str(arbitrary_number) + client_id = str(uuid.uuid4()) header = { - 'X-Project-ID': project_id + 'X-Project-ID': project_id, + 'Client-ID': client_id } # NOTE(kgriffs): It's important that this one sort after the one @@ -253,7 +255,7 @@ class QueueLifecycleBaseTest(base.V1_1Base): # Create some def create_queue(name, project_id, body): - altheader = {} + altheader = {'Client-ID': client_id} if project_id is not None: altheader['X-Project-ID'] = project_id uri = self.queue_path + '/' + name