diff --git a/swift/account/server.py b/swift/account/server.py index 5496ff2b8b..953e5a918e 100644 --- a/swift/account/server.py +++ b/swift/account/server.py @@ -214,10 +214,14 @@ class AccountController(object): content_type='text/plain', request=req) if query_format: req.accept = 'application/%s' % query_format.lower() - out_content_type = req.accept.best_match( - ['text/plain', 'application/json', - 'application/xml', 'text/xml'], - default_match='text/plain') + try: + out_content_type = req.accept.best_match( + ['text/plain', 'application/json', + 'application/xml', 'text/xml'], + default_match='text/plain') + except AssertionError, err: + return HTTPBadRequest(body='bad accept header: %s' % req.accept, + content_type='text/plain', request=req) account_list = broker.list_containers_iter(limit, marker, end_marker, prefix, delimiter) if out_content_type == 'application/json': diff --git a/swift/container/server.py b/swift/container/server.py index 906a784b25..0ac5c41aa3 100644 --- a/swift/container/server.py +++ b/swift/container/server.py @@ -306,10 +306,14 @@ class ContainerController(object): content_type='text/plain', request=req) if query_format: req.accept = 'application/%s' % query_format.lower() - out_content_type = req.accept.best_match( - ['text/plain', 'application/json', - 'application/xml', 'text/xml'], - default_match='text/plain') + try: + out_content_type = req.accept.best_match( + ['text/plain', 'application/json', + 'application/xml', 'text/xml'], + default_match='text/plain') + except AssertionError, err: + return HTTPBadRequest(body='bad accept header: %s' % req.accept, + content_type='text/plain', request=req) container_list = broker.list_objects_iter(limit, marker, end_marker, prefix, delimiter, path) if out_content_type == 'application/json': diff --git a/test/unit/account/test_server.py b/test/unit/account/test_server.py index 846239aba7..879592c4ad 100644 --- a/test/unit/account/test_server.py +++ b/test/unit/account/test_server.py @@ -748,6 +748,23 @@ class TestAccountController(unittest.TestCase): self.assertEquals(resp.status_int, 200) self.assertEquals(resp.body, 'c1\n') + def test_GET_accept_not_valid(self): + req = Request.blank('/sda1/p/a', environ={'REQUEST_METHOD': 'PUT', + 'HTTP_X_TIMESTAMP': '0'}) + self.controller.PUT(req) + req = Request.blank('/sda1/p/a/c1', environ={'REQUEST_METHOD': 'PUT'}, + headers={'X-Put-Timestamp': '1', + 'X-Delete-Timestamp': '0', + 'X-Object-Count': '0', + 'X-Bytes-Used': '0', + 'X-Timestamp': normalize_timestamp(0)}) + self.controller.PUT(req) + req = Request.blank('/sda1/p/a', environ={'REQUEST_METHOD': 'GET'}) + req.accept = 'application/xml*' + resp = self.controller.GET(req) + self.assertEquals(resp.status_int, 400) + self.assertEquals(resp.body, 'bad accept header: application/xml*') + def test_GET_prefix_delimeter_plain(self): req = Request.blank('/sda1/p/a', environ={'REQUEST_METHOD': 'PUT', 'HTTP_X_TIMESTAMP': '0'}) diff --git a/test/unit/container/test_server.py b/test/unit/container/test_server.py index 8cf75844df..64e8cb8ff3 100644 --- a/test/unit/container/test_server.py +++ b/test/unit/container/test_server.py @@ -733,7 +733,24 @@ class TestContainerController(unittest.TestCase): resp = self.controller.GET(req) result = [x['content_type'] for x in simplejson.loads(resp.body)] self.assertEquals(result, [u'\u2603', 'text/plain; "utf-8"']) - + + def test_GET_accept_not_valid(self): + req = Request.blank('/sda1/p/a/c', environ={'REQUEST_METHOD': 'PUT', + 'HTTP_X_TIMESTAMP': '0'}) + self.controller.PUT(req) + req = Request.blank('/sda1/p/a/c1', environ={'REQUEST_METHOD': 'PUT'}, + headers={'X-Put-Timestamp': '1', + 'X-Delete-Timestamp': '0', + 'X-Object-Count': '0', + 'X-Bytes-Used': '0', + 'X-Timestamp': normalize_timestamp(0)}) + self.controller.PUT(req) + req = Request.blank('/sda1/p/a/c', environ={'REQUEST_METHOD': 'GET'}) + req.accept = 'application/xml*' + resp = self.controller.GET(req) + self.assertEquals(resp.status_int, 400) + self.assertEquals(resp.body, 'bad accept header: application/xml*') + def test_GET_limit(self): # make a container req = Request.blank('/sda1/p/a/c', environ={'REQUEST_METHOD': 'PUT',