'HTTP',
]
-linesep_splitter = re.compile(r'\n|\r')
+linesep_splitter = re.compile(r'\n|\r\n?')
@_extend_docstrings
class EmailPolicy(Policy):
if hasattr(value, 'name'):
return value.fold(policy=self)
maxlen = self.max_line_length if self.max_line_length else sys.maxsize
- lines = value.splitlines()
+ # We can't use splitlines here because it splits on more than \r and \n.
+ lines = linesep_splitter.split(value)
refold = (self.refold_source == 'all' or
self.refold_source == 'long' and
(lines and len(lines[0])+len(name)+2 > maxlen or
g.flatten(msg, linesep='\n')
self.assertEqual(s.getvalue(), self.typ(expected))
+ def test_flatten_linesep(self):
+ source = 'Subject: one\n two\r three\r\n four\r\n\r\ntest body\r\n'
+ msg = self.msgmaker(self.typ(source))
+ self.assertEqual(msg['Subject'], 'one two three four')
+
+ expected = 'Subject: one\n two\n three\n four\n\ntest body\n'
+ s = self.ioclass()
+ g = self.genclass(s)
+ g.flatten(msg)
+ self.assertEqual(s.getvalue(), self.typ(expected))
+
+ expected = 'Subject: one two three four\n\ntest body\n'
+ s = self.ioclass()
+ g = self.genclass(s, policy=self.policy.clone(refold_source='all'))
+ g.flatten(msg)
+ self.assertEqual(s.getvalue(), self.typ(expected))
+
+ def test_flatten_control_linesep(self):
+ source = 'Subject: one\v two\f three\x1c four\x1d five\x1e six\r\n\r\ntest body\r\n'
+ msg = self.msgmaker(self.typ(source))
+ self.assertEqual(msg['Subject'], 'one\v two\f three\x1c four\x1d five\x1e six')
+
+ expected = 'Subject: one\v two\f three\x1c four\x1d five\x1e six\n\ntest body\n'
+ s = self.ioclass()
+ g = self.genclass(s)
+ g.flatten(msg)
+ self.assertEqual(s.getvalue(), self.typ(expected))
+
+ s = self.ioclass()
+ g = self.genclass(s, policy=self.policy.clone(refold_source='all'))
+ g.flatten(msg)
+ self.assertEqual(s.getvalue(), self.typ(expected))
+
def test_set_mangle_from_via_policy(self):
source = textwrap.dedent("""\
Subject: test that
ioclass = io.StringIO
typ = str
+ def test_flatten_unicode_linesep(self):
+ source = 'Subject: one\x85 two\u2028 three\u2029 four\r\n\r\ntest body\r\n'
+ msg = self.msgmaker(self.typ(source))
+ self.assertEqual(msg['Subject'], 'one\x85 two\u2028 three\u2029 four')
+
+ expected = 'Subject: =?utf-8?b?b25lwoUgdHdv4oCoIHRocmVl4oCp?= four\n\ntest body\n'
+ s = self.ioclass()
+ g = self.genclass(s)
+ g.flatten(msg)
+ self.assertEqual(s.getvalue(), self.typ(expected))
+
+ s = self.ioclass()
+ g = self.genclass(s, policy=self.policy.clone(refold_source='all'))
+ g.flatten(msg)
+ self.assertEqual(s.getvalue(), self.typ(expected))
+
class TestBytesGenerator(TestGeneratorBase, TestEmailBase):