]> granicus.if.org Git - python/commitdiff
#11590: fix quoprimime decode handling of empty strings and line endings.
authorR David Murray <rdmurray@bitdance.com>
Wed, 23 Mar 2011 19:25:55 +0000 (15:25 -0400)
committerR David Murray <rdmurray@bitdance.com>
Wed, 23 Mar 2011 19:25:55 +0000 (15:25 -0400)
Lib/email/quoprimime.py
Lib/email/test/test_email.py

index 85efc088aa2a4ec2a4a2adebd7bdfd1eaa303f12..7c7711e25449608b752833d2afa69f9b8493715f 100644 (file)
@@ -135,9 +135,9 @@ def header_encode(header_bytes, charset='iso-8859-1'):
     charset names the character set to use in the RFC 2046 header.  It
     defaults to iso-8859-1.
     """
-    # Return empty headers unchanged
+    # Return empty headers as an empty string.
     if not header_bytes:
-        return str(header_bytes)
+        return ''
     # Iterate over every byte, encoding if necessary.
     encoded = []
     for octet in header_bytes:
@@ -268,7 +268,7 @@ def decode(encoded, eol=NL):
             if i == n:
                 decoded += eol
     # Special case if original string did not end with eol
-    if not encoded.endswith(eol) and decoded.endswith(eol):
+    if encoded[-1] not in '\r\n' and decoded.endswith(eol):
         decoded = decoded[:-1]
     return decoded
 
index f9a499fc7b7390534fcac2ef62a309301cbf1b1a..cb3b0b36b2c8ae6b3c33613d7f0e3505a4605914 100644 (file)
@@ -2890,6 +2890,9 @@ class TestQuopri(unittest.TestCase):
             encoded_header = quoprimime.header_encode(header, charset)
         self.assertEqual(encoded_header, expected_encoded_header)
 
+    def test_header_encode_null(self):
+        self._test_header_encode(b'', '')
+
     def test_header_encode_one_word(self):
         self._test_header_encode(b'hello', '=?iso-8859-1?q?hello?=')
 
@@ -2946,6 +2949,15 @@ class TestQuopri(unittest.TestCase):
     def test_decode_one_line_lf(self):
         self._test_decode('hello\n', 'hello\n')
 
+    def test_decode_one_line_cr(self):
+        self._test_decode('hello\r', 'hello\n')
+
+    def test_decode_one_line_nl(self):
+        self._test_decode('hello\n', 'helloX', eol='X')
+
+    def test_decode_one_line_crnl(self):
+        self._test_decode('hello\r\n', 'helloX', eol='X')
+
     def test_decode_one_line_one_word(self):
         self._test_decode('hello\r\nworld', 'hello\nworld')
 
@@ -2955,6 +2967,9 @@ class TestQuopri(unittest.TestCase):
     def test_decode_two_lines(self):
         self._test_decode('hello\r\nworld\r\n', 'hello\nworld\n')
 
+    def test_decode_two_lines_eol(self):
+        self._test_decode('hello\r\nworld\r\n', 'helloXworldX', eol='X')
+
     def test_decode_one_long_line(self):
         self._test_decode('Spam' * 250, 'Spam' * 250)