]> granicus.if.org Git - python/commitdiff
#11584: Since __getitem__ returns headers, make decode_header handle them.
authorR David Murray <rdmurray@bitdance.com>
Fri, 25 Mar 2011 19:10:55 +0000 (15:10 -0400)
committerR David Murray <rdmurray@bitdance.com>
Fri, 25 Mar 2011 19:10:55 +0000 (15:10 -0400)
Why I consider this a bug rather than an API change: the API change was
to Message, which didn't used to return Headers unless you added them
yourself.  Now it does (for 8bit binary header input), so decode_header
needs to be able to handle them.

Lib/email/header.py
Lib/email/test/test_email.py

index 8c325145aa86f1a99ff5c46926cdd2bf9fff912e..2562b30c1672f97e41e70f17a16b2347489a6364 100644 (file)
@@ -66,9 +66,15 @@ def decode_header(header):
     otherwise a lower-case string containing the name of the character set
     specified in the encoded string.
 
+    header may be a string that may or may not contain RFC2047 encoded words,
+    or it may be a Header object.
+
     An email.errors.HeaderParseError may be raised when certain decoding error
     occurs (e.g. a base64 decoding exception).
     """
+    # If it is a Header object, we can just return the chunks.
+    if hasattr(header, '_chunks'):
+        return list(header._chunks)
     # If no encoding, just return the header with no charset.
     if not ecre.search(header):
         return [(header, None)]
index 250a6442b720b83f8e78e43c15b29e592b695763..245f65999b55ded199588d65630cf7815042f834 100644 (file)
@@ -3918,6 +3918,20 @@ A very long line that must get split to something other than at the
         h.append(x, errors='replace')
         eq(str(h), e)
 
+    def test_escaped_8bit_header(self):
+        x = b'Ynwp4dUEbay Auction Semiar- No Charge \x96 Earn Big'
+        x = x.decode('ascii', 'surrogateescape')
+        h = Header(x, charset=email.charset.UNKNOWN8BIT)
+        self.assertEqual(str(h),
+                        'Ynwp4dUEbay Auction Semiar- No Charge \uFFFD Earn Big')
+        self.assertEqual(email.header.decode_header(h), [(x, 'unknown-8bit')])
+
+    def test_modify_returned_list_does_not_change_header(self):
+        h = Header('test')
+        chunks = email.header.decode_header(h)
+        chunks.append(('ascii', 'test2'))
+        self.assertEqual(str(h), 'test')
+
     def test_encoded_adjacent_nonencoded(self):
         eq = self.assertEqual
         h = Header()