diff options
Diffstat (limited to 'Lib/email')
| -rw-r--r-- | Lib/email/base64mime.py | 20 | ||||
| -rw-r--r-- | Lib/email/header.py | 9 | ||||
| -rw-r--r-- | Lib/email/message.py | 6 | ||||
| -rw-r--r-- | Lib/email/quoprimime.py | 2 | ||||
| -rw-r--r-- | Lib/email/test/test_email.py | 4 |
5 files changed, 18 insertions, 23 deletions
diff --git a/Lib/email/base64mime.py b/Lib/email/base64mime.py index 0035b79f6f..369bf10789 100644 --- a/Lib/email/base64mime.py +++ b/Lib/email/base64mime.py @@ -101,25 +101,19 @@ def body_encode(s, maxlinelen=76, eol=NL): -def decode(s, convert_eols=False): +def decode(string): """Decode a raw base64 string, returning a bytes object. - If convert_eols is set to a string value, all canonical email linefeeds, - e.g. "\\r\\n", in the decoded text will be converted to the value of - convert_eols. os.linesep is a good choice for convert_eols if you are - decoding a text attachment. - This function does not parse a full MIME header value encoded with base64 (like =?iso-8895-1?b?bmloISBuaWgh?=) -- please use the high level email.Header class for that functionality. """ - if not s: - return s - - dec = a2b_base64(s) - if convert_eols: - return dec.replace(CRLF, convert_eols) - return dec + if not string: + return bytes() + elif isinstance(string, str): + return a2b_base64(string.encode('raw-unicode-escape')) + else: + return a2b_base64(s) # For convenience and backwards compatibility w/ standard base64 module diff --git a/Lib/email/header.py b/Lib/email/header.py index e03e42d6c1..786a71f647 100644 --- a/Lib/email/header.py +++ b/Lib/email/header.py @@ -341,10 +341,11 @@ class _ValueFormatter: self._current_line = _Accumulator(headerlen) def __str__(self): - # Remove the trailing TRANSITIONAL_SPACE - last_line = self._current_line.pop() - if last_line is not TRANSITIONAL_SPACE: - self._current_line.push(last_line) + # Remove any trailing TRANSITIONAL_SPACE + if len(self._current_line) > 0: + last_line = self._current_line.pop() + if last_line is not TRANSITIONAL_SPACE: + self._current_line.push(last_line) self.newline() return NL.join(self._lines) diff --git a/Lib/email/message.py b/Lib/email/message.py index 50d66041c1..e368737efd 100644 --- a/Lib/email/message.py +++ b/Lib/email/message.py @@ -201,7 +201,8 @@ class Message: # Incorrect padding pass elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'): - in_file = BytesIO(bytes(payload + '\n')) + payload += '\n' + in_file = BytesIO(payload.encode('raw-unicode-escape')) out_file = BytesIO() try: uu.decode(in_file, out_file, quiet=True) @@ -752,7 +753,8 @@ class Message: # LookupError will be raised if the charset isn't known to # Python. UnicodeError will be raised if the encoded text # contains a character not in the charset. - charset = str(bytes(charset[2]), pcharset) + as_bytes = charset[2].encode('raw-unicode-escape') + charset = str(as_bytes, pcharset) except (LookupError, UnicodeError): charset = charset[2] # charset characters must be in us-ascii range diff --git a/Lib/email/quoprimime.py b/Lib/email/quoprimime.py index 1301e0b78d..e59479cbc7 100644 --- a/Lib/email/quoprimime.py +++ b/Lib/email/quoprimime.py @@ -58,7 +58,7 @@ _QUOPRI_HEADER_MAP = dict((c, '=%02X' % c) for c in range(256)) _QUOPRI_BODY_MAP = _QUOPRI_HEADER_MAP.copy() # Safe header bytes which need no encoding. -for c in b'-!*+/' + bytes(ascii_letters, 'ascii') + bytes(digits, 'ascii'): +for c in b'-!*+/' + ascii_letters.encode('ascii') + digits.encode('ascii'): _QUOPRI_HEADER_MAP[c] = chr(c) # Headers have one other special encoding; spaces become underscores. _QUOPRI_HEADER_MAP[ord(' ')] = '_' diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py index 78d702d8ee..f7cac97dcc 100644 --- a/Lib/email/test/test_email.py +++ b/Lib/email/test/test_email.py @@ -2538,10 +2538,8 @@ class TestBase64(unittest.TestCase): def test_decode(self): eq = self.assertEqual - eq(base64mime.decode(''), '') + eq(base64mime.decode(''), b'') eq(base64mime.decode('aGVsbG8='), b'hello') - eq(base64mime.decode('aGVsbG8=', 'X'), b'hello') - eq(base64mime.decode('aGVsbG8NCndvcmxk\n', 'X'), b'helloXworld') def test_encode(self): eq = self.assertEqual |
