From 1772e66fd483184620f49c959816d218ce23659d Mon Sep 17 00:00:00 2001 From: wangxiyuan Date: Wed, 13 Apr 2016 16:12:13 +0800 Subject: [PATCH] Fix the wrong check of X-PROJECT-ID v2 should require project id as well. APIimpact Closes-bug: #1569743 Change-Id: I2beaad5ff920fa1c82d48603b74f93229bb8d706 --- zaqar/common/transport/wsgi/helpers.py | 11 ++++++----- zaqar/tests/unit/transport/wsgi/base.py | 4 +++- .../transport/wsgi/v2_0/test_queue_lifecycle.py | 13 +++++++++++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/zaqar/common/transport/wsgi/helpers.py b/zaqar/common/transport/wsgi/helpers.py index 4953e38d7..4f99b4e67 100644 --- a/zaqar/common/transport/wsgi/helpers.py +++ b/zaqar/common/transport/wsgi/helpers.py @@ -15,6 +15,7 @@ """wsgi transport helpers.""" +from distutils.version import LooseVersion import uuid import falcon @@ -93,12 +94,12 @@ def extract_project_id(req, resp, params): params['project_id'] = req.get_header('X-PROJECT-ID') if params['project_id'] == "": raise falcon.HTTPBadRequest('Empty project header not allowed', - _(u''' -X-PROJECT-ID cannot be an empty string. Specify the right header X-PROJECT-ID -and retry.''')) + _(u'X-PROJECT-ID cannot be an empty ' + u'string. Specify the right header ' + u'X-PROJECT-ID and retry.')) - # TODO(flaper87): Make version comparison smarter to support v2_0. - if not params['project_id'] and 'v1.1' in req.path: + api_version = LooseVersion(req.path.split('/')[1]) + if not params['project_id'] and api_version >= LooseVersion('v1.1'): raise falcon.HTTPBadRequest('Project-Id Missing', _(u'The header X-PROJECT-ID was missing')) diff --git a/zaqar/tests/unit/transport/wsgi/base.py b/zaqar/tests/unit/transport/wsgi/base.py index 9d7c70b2d..3f324fc5b 100644 --- a/zaqar/tests/unit/transport/wsgi/base.py +++ b/zaqar/tests/unit/transport/wsgi/base.py @@ -88,7 +88,9 @@ class TestBase(testing.TestBase): headers = kwargs.get('headers', self.headers).copy() project_id = ('518b51ea133c4facadae42c328d6b77b' if project_id is None else project_id) - headers['X-Project-ID'] = headers.get('X-Project-ID', project_id) + if kwargs.get('need_project_id', True): + headers['X-Project-ID'] = headers.get('X-Project-ID', project_id) + kwargs.pop('need_project_id', None) kwargs['headers'] = headers try: if six.PY3: diff --git a/zaqar/tests/unit/transport/wsgi/v2_0/test_queue_lifecycle.py b/zaqar/tests/unit/transport/wsgi/v2_0/test_queue_lifecycle.py index 8a815dd5d..cd563384a 100644 --- a/zaqar/tests/unit/transport/wsgi/v2_0/test_queue_lifecycle.py +++ b/zaqar/tests/unit/transport/wsgi/v2_0/test_queue_lifecycle.py @@ -55,6 +55,19 @@ class TestQueueLifecycleMongoDB(base.V2Base): super(TestQueueLifecycleMongoDB, self).tearDown() + def test_without_project_id(self): + headers = { + 'Client-ID': str(uuid.uuid4()), + } + + self.simulate_put(self.gumshoe_queue_path, headers=headers, + need_project_id=False) + self.assertEqual(falcon.HTTP_400, self.srmock.status) + + self.simulate_delete(self.gumshoe_queue_path, headers=headers, + need_project_id=False) + self.assertEqual(falcon.HTTP_400, self.srmock.status) + def test_empty_project_id(self): headers = { 'Client-ID': str(uuid.uuid4()),