Kaydet (Commit) 8d8f1104 authored tarafından R David Murray's avatar R David Murray

#14062: fix BytesParser handling of Header objects

This is a different fix than the 3.2 fix, but the new tests are the same.

This also affected smtplib.SMTP.send_message, which calls BytesParser.
...@@ -386,6 +386,9 @@ class BytesGenerator(Generator): ...@@ -386,6 +386,9 @@ class BytesGenerator(Generator):
h = Header(v, charset=_charset.UNKNOWN8BIT, header_name=h) h = Header(v, charset=_charset.UNKNOWN8BIT, header_name=h)
else: else:
h = Header(v, header_name=h) h = Header(v, header_name=h)
else:
# Assume it is a Header-like object.
h = v
self.write(h.encode(linesep=self._NL, self.write(h.encode(linesep=self._NL,
maxlinelen=self._maxheaderlen)+self._NL) maxlinelen=self._maxheaderlen)+self._NL)
# A blank line always separates headers from body # A blank line always separates headers from body
......
...@@ -3601,6 +3601,30 @@ class Test8BitBytesHandling(unittest.TestCase): ...@@ -3601,6 +3601,30 @@ class Test8BitBytesHandling(unittest.TestCase):
g.flatten(msg) g.flatten(msg)
self.assertEqual(s.getvalue(), source) self.assertEqual(s.getvalue(), source)
def test_bytes_generator_b_encoding_linesep(self):
# Issue 14062: b encoding was tacking on an extra \n.
m = Message()
# This has enough non-ascii that it should always end up b encoded.
m['Subject'] = Header('žluťoučký kůň')
s = BytesIO()
g = email.generator.BytesGenerator(s)
g.flatten(m, linesep='\r\n')
self.assertEqual(
s.getvalue(),
b'Subject: =?utf-8?b?xb5sdcWlb3XEjWvDvSBrxa/FiA==?=\r\n\r\n')
def test_generator_b_encoding_linesep(self):
# Since this broke in ByteGenerator, test Generator for completeness.
m = Message()
# This has enough non-ascii that it should always end up b encoded.
m['Subject'] = Header('žluťoučký kůň')
s = StringIO()
g = email.generator.Generator(s)
g.flatten(m, linesep='\r\n')
self.assertEqual(
s.getvalue(),
'Subject: =?utf-8?b?xb5sdcWlb3XEjWvDvSBrxa/FiA==?=\r\n\r\n')
def test_crlf_control_via_policy(self): def test_crlf_control_via_policy(self):
# msg_26 is crlf terminated # msg_26 is crlf terminated
with openfile('msg_26.txt', 'rb') as fp: with openfile('msg_26.txt', 'rb') as fp:
......
...@@ -24,6 +24,9 @@ Core and Builtins ...@@ -24,6 +24,9 @@ Core and Builtins
Library Library
------- -------
- Issue #14062: BytesGenerator now correctly folds Header objects,
including using linesep when folding.
- Issue #13839: When invoked on the command-line, the pstats module now - Issue #13839: When invoked on the command-line, the pstats module now
accepts several filenames of profile stat files and merges them all. accepts several filenames of profile stat files and merges them all.
Patch by Matt Joiner. Patch by Matt Joiner.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment