utils: fix exception with bad encoding
[imapami.git] / imapami / utils.py
index abf79b0..375910c 100644 (file)
@@ -28,6 +28,7 @@
 #
 
 import email.header
+import re
 
 # pylint: disable=deprecated-module
 # see https://www.logilab.org/ticket/2481
@@ -62,11 +63,20 @@ def headers_to_unicode(headers):
     """
     unicode_headers = {}
     for key, hdr in headers.items():
-        value, encoding = email.header.decode_header(hdr)[0]
+        try:
+            value, encoding = email.header.decode_header(hdr)[0]
+        except email.header.HeaderParseError:
+            try:
+                # try to workaround badly formatted RFC2047 tokens
+                hdr = re.sub(r"(==)(?!$)", u"= =", hdr)
+                value, encoding = email.header.decode_header(hdr)[0]
+            except email.header.HeaderParseError:
+                # fallback to wrong decoding
+                value, encoding = hdr, 'utf-8'
         if encoding is None:
-            value = unicode(value)
+            value = unicode(value, errors="replace")
         else:
-            value = value.decode(encoding)
+            value = value.decode(encoding, errors="replace")
         unicode_headers[key] = value
     return unicode_headers