Check OCCI version in user agent
We only support OCCI/1.1, so if we have another version we have to raise a 501 not implemented error.
This commit is contained in:
parent
86329b79f3
commit
2675a8c3d8
@ -97,6 +97,27 @@ class TestMiddleware(base.TestCase):
|
|||||||
self.assertEqual(404, result.status_code)
|
self.assertEqual(404, result.status_code)
|
||||||
self.assertDefaults(result)
|
self.assertDefaults(result)
|
||||||
|
|
||||||
|
def test_good_user_agent(self):
|
||||||
|
req = self._build_req("/", "tenant")
|
||||||
|
req.user_agent = "foo OCCI/1.1 bar"
|
||||||
|
result = req.get_response(self.get_app())
|
||||||
|
self.assertEqual(404, result.status_code)
|
||||||
|
self.assertDefaults(result)
|
||||||
|
|
||||||
|
def test_bad_user_agent(self):
|
||||||
|
req = self._build_req("/", "tenant")
|
||||||
|
req.user_agent = "foo OCCI/2.2 bar"
|
||||||
|
result = req.get_response(self.get_app())
|
||||||
|
self.assertEqual(501, result.status_code)
|
||||||
|
self.assertDefaults(result)
|
||||||
|
|
||||||
|
def test_ugly_user_agent(self):
|
||||||
|
req = self._build_req("/", "tenant")
|
||||||
|
req.user_agent = "fooOCCI/1.1bar"
|
||||||
|
result = req.get_response(self.get_app())
|
||||||
|
self.assertEqual(404, result.status_code)
|
||||||
|
self.assertDefaults(result)
|
||||||
|
|
||||||
def test_400_from_openstack(self):
|
def test_400_from_openstack(self):
|
||||||
@webob.dec.wsgify()
|
@webob.dec.wsgify()
|
||||||
def _fake_app(req):
|
def _fake_app(req):
|
||||||
|
@ -14,6 +14,8 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
import routes
|
import routes
|
||||||
import routes.middleware
|
import routes.middleware
|
||||||
@ -72,6 +74,7 @@ class Request(webob.Request):
|
|||||||
class OCCIMiddleware(object):
|
class OCCIMiddleware(object):
|
||||||
|
|
||||||
occi_version = "1.1"
|
occi_version = "1.1"
|
||||||
|
occi_string = "OCCI/%s" % occi_version
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def factory(cls, global_conf, **local_conf):
|
def factory(cls, global_conf, **local_conf):
|
||||||
@ -157,6 +160,14 @@ class OCCIMiddleware(object):
|
|||||||
return self.process_response(response)
|
return self.process_response(response)
|
||||||
|
|
||||||
def process_request(self, req):
|
def process_request(self, req):
|
||||||
|
if req.user_agent:
|
||||||
|
# FIXME(aloga): review the regexp, since it will only match the
|
||||||
|
# first string
|
||||||
|
match = re.search(r"\bOCCI/\d\.\d\b", req.user_agent)
|
||||||
|
if match and self.occi_string != match.group():
|
||||||
|
return Fault(webob.exc.HTTPNotImplemented(
|
||||||
|
explanation="%s not supported" % match.group()))
|
||||||
|
|
||||||
match = self.mapper.match(req.path_info, req.environ)
|
match = self.mapper.match(req.path_info, req.environ)
|
||||||
if not match:
|
if not match:
|
||||||
return Fault(webob.exc.HTTPNotFound())
|
return Fault(webob.exc.HTTPNotFound())
|
||||||
@ -165,8 +176,8 @@ class OCCIMiddleware(object):
|
|||||||
|
|
||||||
def process_response(self, response):
|
def process_response(self, response):
|
||||||
"""Process a response by adding our headers."""
|
"""Process a response by adding our headers."""
|
||||||
server_string = "ooi/%s OCCI/%s" % (ooi.__version__,
|
server_string = "ooi/%s %s" % (ooi.__version__,
|
||||||
self.occi_version)
|
self.occi_string)
|
||||||
|
|
||||||
headers = (("server", server_string),)
|
headers = (("server", server_string),)
|
||||||
if isinstance(response, Fault):
|
if isinstance(response, Fault):
|
||||||
|
Loading…
Reference in New Issue
Block a user