Fix exception parsing when using WSME
Services that use WSME return errors using a json document that contains 'faultstring' in the root object instead of a dict within a dict. Change-Id: I25d8c64860de7eafb8d543ebcb519fc9664d563e Story: 2008381 Task: 41303
This commit is contained in:
@@ -211,6 +211,9 @@ def raise_from_response(response, error_message=None):
|
|||||||
try:
|
try:
|
||||||
content = response.json()
|
content = response.json()
|
||||||
messages = [_extract_message(obj) for obj in content.values()]
|
messages = [_extract_message(obj) for obj in content.values()]
|
||||||
|
if not any(messages):
|
||||||
|
# Exception dict may be the root dict in projects that use WSME
|
||||||
|
messages = [_extract_message(content)]
|
||||||
# Join all of the messages together nicely and filter out any
|
# Join all of the messages together nicely and filter out any
|
||||||
# objects that don't have a "message" attr.
|
# objects that don't have a "message" attr.
|
||||||
details = '\n'.join(msg for msg in messages if msg)
|
details = '\n'.join(msg for msg in messages if msg)
|
||||||
|
@@ -213,3 +213,21 @@ class TestRaiseFromResponse(base.TestCase):
|
|||||||
self.assertEqual(response.status_code, exc.status_code)
|
self.assertEqual(response.status_code, exc.status_code)
|
||||||
self.assertEqual(self.message, exc.details)
|
self.assertEqual(self.message, exc.details)
|
||||||
self.assertIn(self.message, str(exc))
|
self.assertIn(self.message, str(exc))
|
||||||
|
|
||||||
|
def test_raise_wsme_format(self):
|
||||||
|
response = mock.Mock()
|
||||||
|
response.status_code = 404
|
||||||
|
response.headers = {
|
||||||
|
'content-type': 'application/json',
|
||||||
|
}
|
||||||
|
response.json.return_value = {
|
||||||
|
'faultstring': self.message,
|
||||||
|
'faultcode': 'Client',
|
||||||
|
'debuginfo': None,
|
||||||
|
}
|
||||||
|
exc = self.assertRaises(exceptions.NotFoundException,
|
||||||
|
self._do_raise, response,
|
||||||
|
error_message=self.message)
|
||||||
|
self.assertEqual(response.status_code, exc.status_code)
|
||||||
|
self.assertEqual(self.message, exc.details)
|
||||||
|
self.assertIn(self.message, str(exc))
|
||||||
|
Reference in New Issue
Block a user