From c23890d619ea1bd361c82dadd1249545435329f1 Mon Sep 17 00:00:00 2001 From: "jing.liuqing" Date: Sun, 30 Jun 2019 23:24:18 +0800 Subject: [PATCH] Allow fault code customization Sometime we need to custom error error, see also [1] [1]: https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/ErrorResponses.html Change-Id: I8ce01fbcf913648c1efa6a2acd3a2069f9c2e403 --- wsme/api.py | 6 ++++-- wsme/exc.py | 3 ++- wsme/tests/test_api.py | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/wsme/api.py b/wsme/api.py index 67263a0..9850b67 100644 --- a/wsme/api.py +++ b/wsme/api.py @@ -217,7 +217,8 @@ def format_exception(excinfo, debug=False): if code and utils.is_valid_code(code) and utils.is_client_error(code): faultstring = (error.faultstring if hasattr(error, 'faultstring') else six.text_type(error)) - r = dict(faultcode="Client", + faultcode = getattr(error, 'faultcode', 'Client') + r = dict(faultcode=faultcode, faultstring=faultstring) log.debug("Client-side error: %s" % r['faultstring']) r['debuginfo'] = None @@ -229,7 +230,8 @@ def format_exception(excinfo, debug=False): log.error('Server-side error: "%s". Detail: \n%s' % ( faultstring, debuginfo)) - r = dict(faultcode="Server", faultstring=faultstring) + faultcode = getattr(error, 'faultcode', 'Server') + r = dict(faultcode=faultcode, faultstring=faultstring) if debug: r['debuginfo'] = debuginfo else: diff --git a/wsme/exc.py b/wsme/exc.py index 81dcbf8..e70db65 100644 --- a/wsme/exc.py +++ b/wsme/exc.py @@ -4,9 +4,10 @@ from wsme.utils import _ class ClientSideError(RuntimeError): - def __init__(self, msg=None, status_code=400): + def __init__(self, msg=None, status_code=400, faultcode='Client'): self.msg = msg self.code = status_code + self.faultcode = faultcode super(ClientSideError, self).__init__(self.faultstring) @property diff --git a/wsme/tests/test_api.py b/wsme/tests/test_api.py index f371340..36bc2eb 100644 --- a/wsme/tests/test_api.py +++ b/wsme/tests/test_api.py @@ -396,6 +396,15 @@ class TestFormatException(unittest.TestCase): self.assertEqual('Client', ret['faultcode']) self.assertEqual(faultstring, ret['faultstring']) + def test_format_client_exception_with_faultcode(self): + faultcode = 'AccessDenied' + faultstring = 'boom' + ret = self._test_format_exception( + exc.ClientSideError(faultstring, faultcode=faultcode)) + self.assertIsNone(ret['debuginfo']) + self.assertEqual('AccessDenied', ret['faultcode']) + self.assertEqual(faultstring, ret['faultstring']) + def test_format_server_exception(self): faultstring = 'boom' ret = self._test_format_exception(Exception(faultstring)) @@ -410,6 +419,15 @@ class TestFormatException(unittest.TestCase): self.assertEqual('Server', ret['faultcode']) self.assertEqual(faultstring, ret['faultstring']) + def test_format_server_exception_with_faultcode(self): + faultstring = 'boom' + exception = Exception(faultstring) + exception.faultcode = 'ServerError' + ret = self._test_format_exception(exception) + self.assertIsNone(ret['debuginfo']) + self.assertEqual('ServerError', ret['faultcode']) + self.assertEqual(faultstring, ret['faultstring']) + def test_format_server_exception_debug(self): faultstring = 'boom' ret = self._test_format_exception(Exception(faultstring), debug=True)