diff options
author | Zhao Chao <zhaochao1984@gmail.com> | 2018-02-06 15:31:42 +0800 |
---|---|---|
committer | Zhao Chao <zhaochao1984@gmail.com> | 2018-02-06 16:00:59 +0800 |
commit | 0b28b04ebbfaed981f4e00e69e4c7a8e0ed75395 (patch) | |
tree | 3cc23bdb903460ae36b6449f53284fad71b09d4d /troveclient/apiclient | |
parent | 0ecff6e004f5c7b7d78043ddd2e3d075ebfa503a (diff) | |
download | python-troveclient-0b28b04ebbfaed981f4e00e69e4c7a8e0ed75395.tar.gz |
Handle error response for webob>=1.6.0
WebOb change https://github.com/Pylons/webob/pull/230 changed
the way in which the error response body is formatted such that
it's no longer a nested dict. So we have to handle both the
old convention of an error message key to the response body error
dict and the new way with just the error body dict.
This was reported upstream:
https://github.com/Pylons/webob/issues/235
But given this was apparently implemented as a long-overdue change
in WebOb the behavior is not likely to change.
Change-Id: Id8bfde6277640de48768bbe5a5e4252b97253ed2
Closes-Bug: #1559072
Co-Authored-By: Matt Riedemann <mriedem@us.ibm.com>
Signed-off-by: Zhao Chao <zhaochao1984@gmail.com>
Diffstat (limited to 'troveclient/apiclient')
-rw-r--r-- | troveclient/apiclient/exceptions.py | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/troveclient/apiclient/exceptions.py b/troveclient/apiclient/exceptions.py index c48df3a..5c70c08 100644 --- a/troveclient/apiclient/exceptions.py +++ b/troveclient/apiclient/exceptions.py @@ -426,10 +426,26 @@ def from_response(response, method, url): except ValueError: pass else: - if isinstance(body, dict): - error = list(body.values())[0] - kwargs["message"] = error.get("message", None) - kwargs["details"] = error.get("details", None) + if hasattr(body, 'keys'): + # NOTE(mriedem): WebOb<1.6.0 will return a nested dict + # structure where the error keys to the + # message/details/code. WebOb>=1.6.0 returns just a response + # body as a single dict, not nested, so we have to handle + # both cases (since we can't trust what we're given with + # content_type: application/json either way. + if 'message' in body: + # WebOb 1.6.0 case + message = body.get('message') + details = body.get('details') + else: + # WebOb<1.6.0 where we assume there is a single error + # message key to the body that has the message and details. + error = list(body.values())[0] + message = error.get("message") + details = error.get("details") + + kwargs["message"] = message + kwargs["details"] = details elif content_type.startswith("text/"): kwargs["details"] = response.text |