From 2d4054c2748945a92faae22a91990ac1cc084427 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 26 Aug 2015 16:32:58 +0300 Subject: [PATCH 1/2] base64 properties was always been decoded with base64.b64decode(data).decode('utf8') which is a strict mode. base64 values should be decoded with proper encodings --- xdebug/helper/helper.py | 10 +++++----- xdebug/view.py | 16 +++++++++++++--- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/xdebug/helper/helper.py b/xdebug/helper/helper.py index 8ded504..1e7a6c2 100644 --- a/xdebug/helper/helper.py +++ b/xdebug/helper/helper.py @@ -30,19 +30,19 @@ def dictionary_values(dictionary): def data_read(data): # Convert bytes to string - return data.decode('utf8') + return data.decode('utf8', 'replace') def data_write(data): # Convert string to bytes - return bytes(data, 'utf8') + return bytes(data, 'utf8', 'replace') -def base64_decode(data): +def base64_decode(data, charset, errorMode = 'strict'): # Base64 returns decoded byte string, decode to convert to UTF8 string - return base64.b64decode(data).decode('utf8') + return base64.b64decode(data).decode(charset, errorMode) def base64_encode(data): # Base64 needs ascii input to encode, which returns Base64 byte string, decode to convert to UTF8 string - return base64.b64encode(data.encode('ascii')).decode('utf8') + return base64.b64encode(data.encode('ascii')).decode('utf8', 'replace') def unicode_chr(code): return chr(code) diff --git a/xdebug/view.py b/xdebug/view.py index 193295a..abb4bbd 100644 --- a/xdebug/view.py +++ b/xdebug/view.py @@ -317,10 +317,20 @@ def get_response_properties(response, default_key=None): property_value = child.text # Try to decode property value when encoded with base64 if property_encoding is not None and property_encoding == 'base64': + view = sublime.active_window().active_view() + match = re.search(r'\((.*?)\)', view.encoding()) + if match: + encoding_name = match.group(1) + encoding_name = encoding_name.replace(' ', '-').lower() try: - property_value = H.base64_decode(child.text) - except: - pass + property_value = H.base64_decode(child.text, 'utf8') + except (UnicodeDecodeError, LookupError): + if encoding_name == 'Undefined': + raise + else: + property_value = H.base64_decode(child.text, encoding_name) + except (UnicodeDecodeError, LookupError): + property_value = H.base64_decode(child.text, 'utf8', 'replace') if property_name is not None and len(property_name) > 0: property_key = property_name From fa188433e249bb85f33e6ff015aa2637e95c8057 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 27 Aug 2015 18:29:34 +0300 Subject: [PATCH 2/2] I dont know what causes this but UnicodeDecodeError exception was thrown even it was in try except block --- xdebug/view.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/xdebug/view.py b/xdebug/view.py index abb4bbd..291c4d3 100644 --- a/xdebug/view.py +++ b/xdebug/view.py @@ -319,17 +319,25 @@ def get_response_properties(response, default_key=None): if property_encoding is not None and property_encoding == 'base64': view = sublime.active_window().active_view() match = re.search(r'\((.*?)\)', view.encoding()) + encoding_name = ''; if match: encoding_name = match.group(1) encoding_name = encoding_name.replace(' ', '-').lower() + decoded = False try: property_value = H.base64_decode(child.text, 'utf8') - except (UnicodeDecodeError, LookupError): - if encoding_name == 'Undefined': - raise - else: + decoded = True + except: + pass + + if (not encoding_name == '') and (not encoding_name == 'Undefined'): + try: property_value = H.base64_decode(child.text, encoding_name) - except (UnicodeDecodeError, LookupError): + decoded = True + except: + pass + + if not decoded: property_value = H.base64_decode(child.text, 'utf8', 'replace') if property_name is not None and len(property_name) > 0: