#22233: Only split headers on \r and/or \n, per email RFCs.

Original patch by Martin Panter, new policy fixes by me.
This commit is contained in:
R David Murray 2016-09-07 17:44:34 -04:00
parent 6b46ec7733
commit dc1650ca06
6 changed files with 104 additions and 19 deletions

View file

@ -2,6 +2,7 @@ import io
import email
import unittest
from email.message import Message
from email.policy import default
from test.test_email import TestEmailBase
@ -32,5 +33,45 @@ class TestCustomMessage(TestEmailBase):
# XXX add tests for other functions that take Message arg.
class TestParserBase:
def test_only_split_on_cr_lf(self):
# The unicode line splitter splits on unicode linebreaks, which are
# more numerous than allowed by the email RFCs; make sure we are only
# splitting on those two.
msg = self.parser(
"Next-Line: not\x85broken\r\n"
"Null: not\x00broken\r\n"
"Vertical-Tab: not\vbroken\r\n"
"Form-Feed: not\fbroken\r\n"
"File-Separator: not\x1Cbroken\r\n"
"Group-Separator: not\x1Dbroken\r\n"
"Record-Separator: not\x1Ebroken\r\n"
"Line-Separator: not\u2028broken\r\n"
"Paragraph-Separator: not\u2029broken\r\n"
"\r\n",
policy=default,
)
self.assertEqual(msg.items(), [
("Next-Line", "not\x85broken"),
("Null", "not\x00broken"),
("Vertical-Tab", "not\vbroken"),
("Form-Feed", "not\fbroken"),
("File-Separator", "not\x1Cbroken"),
("Group-Separator", "not\x1Dbroken"),
("Record-Separator", "not\x1Ebroken"),
("Line-Separator", "not\u2028broken"),
("Paragraph-Separator", "not\u2029broken"),
])
self.assertEqual(msg.get_payload(), "")
class TestParser(TestParserBase, TestEmailBase):
parser = staticmethod(email.message_from_string)
class TestBytesParser(TestParserBase, TestEmailBase):
def parser(self, s, *args, **kw):
return email.message_from_bytes(s.encode(), *args, **kw)
if __name__ == '__main__':
unittest.main()