diff --git a/flask_debugtoolbar/__init__.py b/flask_debugtoolbar/__init__.py index 3b8e614..b3e3264 100644 --- a/flask_debugtoolbar/__init__.py +++ b/flask_debugtoolbar/__init__.py @@ -30,7 +30,10 @@ def replace_insensitive(string, target, replacement): def _printable(value): try: - return repr(value) + value = repr(value) + if isinstance(value, bytes): + value = value.decode('ascii', 'replace') + return value except Exception as e: return '' % ( object.__repr__(value), type(e).__name__, e) diff --git a/test/test_toolbar.py b/test/test_toolbar.py index c14c846..fd04ddc 100644 --- a/test/test_toolbar.py +++ b/test/test_toolbar.py @@ -1,3 +1,10 @@ +import sys + +import pytest + +from flask_debugtoolbar import _printable + + def load_app(name): app = __import__(name).app app.config['TESTING'] = True @@ -9,3 +16,26 @@ def test_basic_app(): index = app.get('/') assert index.status_code == 200 assert b'
= (3,), + reason='test only applies to Python 2') +def test_printable_unicode(): + class UnicodeRepr(object): + def __repr__(self): + return u'\uffff' + + printable = _printable(UnicodeRepr()) + assert "raised UnicodeEncodeError: 'ascii' codec" in printable + + +@pytest.mark.skipif(sys.version_info >= (3,), + reason='test only applies to Python 2') +def test_printable_non_ascii(): + class NonAsciiRepr(object): + def __repr__(self): + return 'a\xffb' + + printable = u'%s' % _printable(NonAsciiRepr()) + # should replace \xff with the unicode ? character + assert printable == u'a\ufffdb'