diff options
author | Barry Warsaw <barry@python.org> | 2004-08-07 15:57:52 (GMT) |
---|---|---|
committer | Barry Warsaw <barry@python.org> | 2004-08-07 15:57:52 (GMT) |
commit | 8896bf56a2955c2bb5d380a7e6cfed044f10b869 (patch) | |
tree | 9c78ef341e3020142a56239d850e420b84ff22e3 /Lib/email | |
parent | 14d535c3d45010919cb1fc2e3830f24041ae02c5 (diff) | |
download | cpython-8896bf56a2955c2bb5d380a7e6cfed044f10b869.zip cpython-8896bf56a2955c2bb5d380a7e6cfed044f10b869.tar.gz cpython-8896bf56a2955c2bb5d380a7e6cfed044f10b869.tar.bz2 |
Resolution of SF bug #1002475 and patch #1003693; Header lines that end in
\r\n only get the \n stripped, not the \r (unless it's the last header which
does get the \r stripped). Patch by Tony Meyer.
test_whitespace_continuation_last_header(),
test_strip_line_feed_and_carriage_return_in_headers(): New tests.
_parse_headers(): Be sure to strip \r\n from the right side of header lines.
Diffstat (limited to 'Lib/email')
-rw-r--r-- | Lib/email/FeedParser.py | 5 | ||||
-rw-r--r-- | Lib/email/test/test_email.py | 31 |
2 files changed, 33 insertions, 3 deletions
diff --git a/Lib/email/FeedParser.py b/Lib/email/FeedParser.py index af0e177..dc3027d 100644 --- a/Lib/email/FeedParser.py +++ b/Lib/email/FeedParser.py @@ -415,7 +415,8 @@ class FeedParser: continue if lastheader: # XXX reconsider the joining of folded lines - self._cur[lastheader] = EMPTYSTRING.join(lastvalue)[:-1] + lhdr = EMPTYSTRING.join(lastvalue)[:-1].rstrip('\r\n') + self._cur[lastheader] = lhdr lastheader, lastvalue = '', [] # Check for envelope header, i.e. unix-from if line.startswith('From '): @@ -449,4 +450,4 @@ class FeedParser: # Done with all the lines, so handle the last header. if lastheader: # XXX reconsider the joining of folded lines - self._cur[lastheader] = EMPTYSTRING.join(lastvalue).rstrip() + self._cur[lastheader] = EMPTYSTRING.join(lastvalue).rstrip('\r\n') diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py index 0d7e79f..1749102 100644 --- a/Lib/email/test/test_email.py +++ b/Lib/email/test/test_email.py @@ -2307,7 +2307,7 @@ class TestParsers(TestEmailBase): self.failIf(msg.is_multipart()) self.failUnless(isinstance(msg.get_payload(), str)) - def test_whitespace_continuaton(self): + def test_whitespace_continuation(self): eq = self.assertEqual # This message contains a line after the Subject: header that has only # whitespace, but it is not empty! @@ -2325,6 +2325,24 @@ Here's the message body eq(msg['message-id'], 'spam') eq(msg.get_payload(), "Here's the message body\n") + def test_whitespace_continuation_last_header(self): + eq = self.assertEqual + # Like the previous test, but the subject line is the last + # header. + msg = email.message_from_string("""\ +From: aperson@dom.ain +To: bperson@dom.ain +Date: Mon, 8 Apr 2002 15:09:19 -0400 +Message-ID: spam +Subject: the next line has a space on it +\x20 + +Here's the message body +""") + eq(msg['subject'], 'the next line has a space on it\n ') + eq(msg['message-id'], 'spam') + eq(msg.get_payload(), "Here's the message body\n") + def test_crlf_separation(self): eq = self.assertEqual fp = openfile('msg_26.txt', mode='rb') @@ -2381,6 +2399,17 @@ Here's the message body msg = email.message_from_string(NL.join(lines)) self.assertEqual(msg['date'], 'Tue, 20 Aug 2002 16:43:45 +1000') + def test_strip_line_feed_and_carriage_return_in_headers(self): + eq = self.assertEqual + # For [ 1002475 ] email message parser doesn't handle \r\n correctly + value1 = 'text' + value2 = 'more text' + m = 'Header: %s\r\nNext-Header: %s\r\n\r\nBody\r\n\r\n' % ( + value1, value2) + msg = email.message_from_string(m) + eq(msg.get('Header'), value1) + eq(msg.get('Next-Header'), value2) + class TestBase64(unittest.TestCase): |