diff --git a/swh/web/ui/converters.py b/swh/web/ui/converters.py --- a/swh/web/ui/converters.py +++ b/swh/web/ui/converters.py @@ -5,6 +5,7 @@ import datetime +from swh.core.utils import decode_with_escape from swh.core import hashutil from swh.web.ui import utils @@ -86,7 +87,10 @@ elif key in hashess: new_dict[key] = utils.fmap(convert_hashes_bytes, value) elif key in bytess: - new_dict[key] = utils.fmap(convert_bytes, value) + try: + new_dict[key] = utils.fmap(convert_bytes, value) + except UnicodeDecodeError: + new_dict[key] = utils.fmap(decode_with_escape, value) elif key in convert: new_dict[key] = convert_fn(value) else: diff --git a/swh/web/ui/tests/test_converters.py b/swh/web/ui/tests/test_converters.py --- a/swh/web/ui/tests/test_converters.py +++ b/swh/web/ui/tests/test_converters.py @@ -100,6 +100,28 @@ self.assertEquals(expected_output, actual_output) @istest + def from_swh_edge_cases_convert_invalid_utf8_bytes(self): + some_input = { + 'a': 'something', + 'b': 'someone', + 'c': b'a name \xff', + 'd': b'an email \xff', + } + + expected_output = { + 'a': 'something', + 'b': 'someone', + 'c': 'a name \\xff', + 'd': 'an email \\xff', + } + + actual_output = converters.from_swh(some_input, + hashess={'a', 'b'}, + bytess={'c', 'd'}) + + self.assertEquals(expected_output, actual_output) + + @istest def from_swh_empty(self): # when self.assertEquals({}, converters.from_swh({}))