Merge "Strip json and html from error messages"
This commit is contained in:
commit
991b207f2d
|
@ -13,6 +13,7 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import re
|
||||
import sys
|
||||
|
||||
|
||||
|
@ -152,7 +153,31 @@ def from_response(response):
|
|||
"""Return an instance of an HTTPException based on httplib response."""
|
||||
cls = _code_map.get(response.status_code, HTTPException)
|
||||
body = response.content
|
||||
if body:
|
||||
if body and response.headers['content-type'].\
|
||||
lower().startswith("application/json"):
|
||||
# Iterate over the nested objects and retreive the "message" attribute.
|
||||
messages = [obj.get('message') for obj in response.json().values()]
|
||||
# Join all of the messages together nicely and filter out any objects
|
||||
# that don't have a "message" attr.
|
||||
details = '\n'.join(i for i in messages if i is not None)
|
||||
return cls(details=details)
|
||||
elif body and \
|
||||
response.headers['content-type'].lower().startswith("text/html"):
|
||||
# Split the lines, strip whitespace and inline HTML from the response.
|
||||
details = [re.sub(r'<.+?>', '', i.strip())
|
||||
for i in response.text.splitlines()]
|
||||
details = [i for i in details if i]
|
||||
# Remove duplicates from the list.
|
||||
details_seen = set()
|
||||
details_temp = []
|
||||
for i in details:
|
||||
if i not in details_seen:
|
||||
details_temp.append(i)
|
||||
details_seen.add(i)
|
||||
# Return joined string separated by colons.
|
||||
details = ': '.join(details_temp)
|
||||
return cls(details=details)
|
||||
elif body:
|
||||
details = body.replace('\n\n', '\n')
|
||||
return cls(details=details)
|
||||
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
# Copyright 2012 OpenStack Foundation
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import mock
|
||||
import testtools
|
||||
|
||||
from muranoclient.common import exceptions as exc
|
||||
|
||||
HTML_MSG = """<html>
|
||||
<head>
|
||||
<title>403 Forbidden</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>403 Forbidden</h1>
|
||||
Access was denied to this resource.<br /><br />
|
||||
</body>
|
||||
</html>"""
|
||||
|
||||
|
||||
class TestHTTPExceptions(testtools.TestCase):
|
||||
def test_handles_json(self):
|
||||
"""exc.from_response should not print JSON."""
|
||||
mock_resp = mock.Mock()
|
||||
mock_resp.status_code = 413
|
||||
mock_resp.json.return_value = {
|
||||
"overLimit": {
|
||||
"code": 413,
|
||||
"message": "OverLimit Retry...",
|
||||
"details": "Error Details...",
|
||||
"retryAt": "2015-08-31T21:21:06Z"
|
||||
}
|
||||
}
|
||||
mock_resp.headers = {
|
||||
"content-type": "application/json"
|
||||
}
|
||||
err = exc.from_response(mock_resp)
|
||||
self.assertIsInstance(err, exc.HTTPOverLimit)
|
||||
self.assertEqual("OverLimit Retry...", err.details)
|
||||
|
||||
def test_handles_html(self):
|
||||
"""exc.from_response should not print HTML."""
|
||||
mock_resp = mock.Mock()
|
||||
mock_resp.status_code = 403
|
||||
mock_resp.text = HTML_MSG
|
||||
mock_resp.headers = {
|
||||
"content-type": "text/html"
|
||||
}
|
||||
err = exc.from_response(mock_resp)
|
||||
self.assertIsInstance(err, exc.HTTPForbidden)
|
||||
self.assertEqual("403 Forbidden: Access was denied to this resource.",
|
||||
err.details)
|
Loading…
Reference in New Issue