From 64688e792a2ad2c71cc213607b77c5934087ac4c Mon Sep 17 00:00:00 2001 From: Alvaro Lopez Garcia Date: Tue, 20 Oct 2015 10:18:06 +0200 Subject: [PATCH] Handle multiple content-types into one header field HTTP specification states that multiple values for one header can be passed if separated by commas. rOCCI uses that for the content type, therefore we must support it. Change-Id: Ib02e6659e112ee9fb90da986339f2f749f0dbc87 Closes-Bug: 1507925 --- ooi/tests/test_wsgi.py | 21 +++++++++++++++++++++ ooi/wsgi/__init__.py | 11 +++++++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/ooi/tests/test_wsgi.py b/ooi/tests/test_wsgi.py index 2642fa2..cbeb5ba 100644 --- a/ooi/tests/test_wsgi.py +++ b/ooi/tests/test_wsgi.py @@ -113,6 +113,27 @@ class TestMiddleware(base.TestCase): result = req.get_response(self.app) self.assertEqual(406, result.status_code) + def test_various_content_type_post(self): + req = webob.Request.blank("/foos", + method="POST", + content_type="text/occi,text/plain") + result = req.get_response(self.app) + self.assertEqual(501, result.status_code) + + def test_various_one_bad_content_type_post(self): + req = webob.Request.blank("/foos", + method="POST", + content_type="text/bazonk,text/plain") + result = req.get_response(self.app) + self.assertEqual(501, result.status_code) + + def test_various_bad_content_types_post(self): + req = webob.Request.blank("/foos", + method="POST", + content_type="text/bazonk,text/foobar") + result = req.get_response(self.app) + self.assertEqual(406, result.status_code) + def test_bad_content_type_post(self): req = webob.Request.blank("/foos", method="POST", diff --git a/ooi/wsgi/__init__.py b/ooi/wsgi/__init__.py index 8cbcfa7..558b0ae 100644 --- a/ooi/wsgi/__init__.py +++ b/ooi/wsgi/__init__.py @@ -48,11 +48,14 @@ class Request(webob.Request): if not self.should_have_body(): return None - if self.content_type not in parsers.get_supported_content_types(): - LOG.debug("Unrecognized Content-Type provided in request") - raise exception.InvalidContentType(content_type=self.content_type) + content_types = self.content_type.split(",") - return self.content_type + for ct in content_types: + if ct in parsers.get_supported_content_types(): + return ct + + LOG.debug("Unrecognized Content-Type provided in request") + raise exception.InvalidContentType(content_type=self.content_type) def get_best_match_content_type(self, default_match=None): content_types = serializers.get_supported_content_types()