summaryrefslogtreecommitdiffstats
path: root/Lib/email
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>2004-08-07 15:57:52 (GMT)
committerBarry Warsaw <barry@python.org>2004-08-07 15:57:52 (GMT)
commit8896bf56a2955c2bb5d380a7e6cfed044f10b869 (patch)
tree9c78ef341e3020142a56239d850e420b84ff22e3 /Lib/email
parent14d535c3d45010919cb1fc2e3830f24041ae02c5 (diff)
downloadcpython-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.py5
-rw-r--r--Lib/email/test/test_email.py31
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):