summaryrefslogtreecommitdiff
path: root/troveclient/apiclient
diff options
context:
space:
mode:
authorZhao Chao <zhaochao1984@gmail.com>2018-02-06 15:31:42 +0800
committerZhao Chao <zhaochao1984@gmail.com>2018-02-06 16:00:59 +0800
commit0b28b04ebbfaed981f4e00e69e4c7a8e0ed75395 (patch)
tree3cc23bdb903460ae36b6449f53284fad71b09d4d /troveclient/apiclient
parent0ecff6e004f5c7b7d78043ddd2e3d075ebfa503a (diff)
downloadpython-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.py24
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