From d7ecd0efddb0492fc94b925426b6a7e559b1a384 Mon Sep 17 00:00:00 2001 From: wagneracacio Date: Fri, 28 May 2021 18:04:56 -0300 Subject: [PATCH 1/4] Update api_structure.py Solved error in decoding special chars in comments of device. --- routeros_api/api_structure.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/routeros_api/api_structure.py b/routeros_api/api_structure.py index 7899956..1d6554b 100644 --- a/routeros_api/api_structure.py +++ b/routeros_api/api_structure.py @@ -3,6 +3,7 @@ import datetime import ipaddress import re +import cchardet as chardet class Field(object): @@ -28,7 +29,10 @@ def get_mikrotik_value(self, string): return string.encode() def get_python_value(self, bytes): - return bytes.decode() + try: + return bytes.decode('utf-8') + except: + return bytes.decode(chardet.detect(bytes)['encoding']) class BytesField(Field): From ccbe036f84c1204debd6c3424722a8be815271be Mon Sep 17 00:00:00 2001 From: wagneracacio Date: Fri, 28 May 2021 18:34:16 -0300 Subject: [PATCH 2/4] Update api_structure.py add iso decode to try --- routeros_api/api_structure.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/routeros_api/api_structure.py b/routeros_api/api_structure.py index 1d6554b..d0f995c 100644 --- a/routeros_api/api_structure.py +++ b/routeros_api/api_structure.py @@ -32,7 +32,10 @@ def get_python_value(self, bytes): try: return bytes.decode('utf-8') except: - return bytes.decode(chardet.detect(bytes)['encoding']) + try: + return bytes.decode('iso8859-1') + except: + return bytes.decode(chardet.detect(bytes)['encoding']) class BytesField(Field): From 5eaf5cb8e6867bb53dd29ce4fb7a23dc7e62c82b Mon Sep 17 00:00:00 2001 From: wagneracacio Date: Fri, 4 Jun 2021 08:23:41 -0300 Subject: [PATCH 3/4] Update test_resource.py add tests to check decode errors --- tests/test_resource.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/test_resource.py b/tests/test_resource.py index 90ada5d..a8d4e59 100644 --- a/tests/test_resource.py +++ b/tests/test_resource.py @@ -68,3 +68,16 @@ def test_boolean_resource_set(self): communicator.call.assert_called_with( '/boolean/', 'set', arguments={'boolean': b'yes'}, queries={}, additional_queries=()) + + + def test_unicode_decode_error(self): + string = structure.StringField + output = string.get_python_value(string,bytes=b'\xc2') + self.assertEqual(output, 'Â') + + + + def test_blank_decode_byte(self): + string = structure.StringField + output = string.get_python_value(string,bytes=b'') + self.assertEqual(output, '') From de68612705fec0e68dbb7d95d78f0257524b1ac7 Mon Sep 17 00:00:00 2001 From: wagneracacio Date: Fri, 4 Jun 2021 08:26:02 -0300 Subject: [PATCH 4/4] Update api_structure.py removed iso decode and check if bytes aren't blank to detect type of decode. --- routeros_api/api_structure.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/routeros_api/api_structure.py b/routeros_api/api_structure.py index d0f995c..74a2651 100644 --- a/routeros_api/api_structure.py +++ b/routeros_api/api_structure.py @@ -29,13 +29,9 @@ def get_mikrotik_value(self, string): return string.encode() def get_python_value(self, bytes): - try: - return bytes.decode('utf-8') - except: - try: - return bytes.decode('iso8859-1') - except: - return bytes.decode(chardet.detect(bytes)['encoding']) + if bytes: + return bytes.decode(chardet.detect(bytes)['encoding']) + return bytes.decode() class BytesField(Field):