diff options
author | Flaper Fesp <flaper87@gmail.com> | 2013-07-11 15:28:49 +0200 |
---|---|---|
committer | Flaper Fesp <flaper87@gmail.com> | 2013-07-29 09:30:44 +0200 |
commit | fd0e1175795ac3a5497dcf72ed250077abaf2ed1 (patch) | |
tree | d50d8f030d0e863d74ffc45afa222dfc105a0fca | |
parent | 8d7411d78b87020a7c5765dc294118f24449db0c (diff) | |
download | python-glanceclient-fd0e1175795ac3a5497dcf72ed250077abaf2ed1.tar.gz |
Encode error messages before sending them to stdout
When an error with non-ascii characters is caught by glanceclient, it
fails at printing it and exists with a UnicodeEncodedError. This patch
encodes errors' messages using strutils before sending them to stdout.
Fixes bug: #1200206
Change-Id: I4dabcd76ffb258840bd6a66ad23c030f34960e86
-rw-r--r-- | glanceclient/common/utils.py | 12 | ||||
-rw-r--r-- | glanceclient/shell.py | 2 | ||||
-rw-r--r-- | tests/test_utils.py | 15 |
3 files changed, 28 insertions, 1 deletions
diff --git a/glanceclient/common/utils.py b/glanceclient/common/utils.py index 49976ac..c0e65db 100644 --- a/glanceclient/common/utils.py +++ b/glanceclient/common/utils.py @@ -202,3 +202,15 @@ def getsockopt(self, *args, **kwargs): lands in mainstream packages. """ return self.fd.getsockopt(*args, **kwargs) + + +def exception_to_str(exc): + try: + error = unicode(exc) + except UnicodeError: + try: + error = str(exc) + except UnicodeError: + error = ("Caught '%(exception)s' exception." % + {"exception": exc.__class__.__name__}) + return strutils.safe_encode(error, errors='ignore') diff --git a/glanceclient/shell.py b/glanceclient/shell.py index aea3a7a..e0124e5 100644 --- a/glanceclient/shell.py +++ b/glanceclient/shell.py @@ -472,5 +472,5 @@ def main(): print >> sys.stderr, '... terminating glance client' sys.exit(1) except Exception as e: - print >> sys.stderr, e + print >> sys.stderr, utils.exception_to_str(e) sys.exit(1) diff --git a/tests/test_utils.py b/tests/test_utils.py index 138ce87..d47c7bb 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -93,3 +93,18 @@ class TestUtils(testtools.TestCase): | Key | Value | +----------+-------+ ''') + + def test_exception_to_str(self): + class FakeException(Exception): + def __str__(self): + raise UnicodeError() + + ret = utils.exception_to_str(Exception('error message')) + self.assertEqual(ret, 'error message') + + ret = utils.exception_to_str(Exception('\xa5 error message')) + self.assertEqual(ret, ' error message') + + ret = utils.exception_to_str(FakeException('\xa5 error message')) + self.assertEqual(ret, "Caught '%(exception)s' exception." % + {'exception': 'FakeException'}) |