Skip to content

Commit

Permalink
Merged revisions 82922 via svnmerge from
Browse files Browse the repository at this point in the history
svn+ssh://[email protected]/python/branches/py3k

........
  r82922 | r.david.murray | 2010-07-16 21:19:57 -0400 (Fri, 16 Jul 2010) | 4 lines

  #1555570: correctly handle a \r\n that is split by the read buffer.

  Patch and test by Tony Nelson.
........
  • Loading branch information
bitdancer committed Jul 17, 2010
1 parent 4393933 commit 6d4a06c
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Lib/email/feedparser.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,10 @@ def push(self, data):
# data after the final RE. In the case of a NL/CR terminated string,
# this is the empty string.
self._partial = parts.pop()
#GAN 29Mar09 bugs 1555570, 1721862 Confusion at 8K boundary ending with \r:
# is there a \n to follow later?
if not self._partial and parts and parts[-1].endswith('\r'):
self._partial = parts.pop(-2)+parts.pop()
# parts is a list of strings, alternating between the line contents
# and the eol character(s). Gather up a list of lines after
# re-attaching the newlines.
Expand Down
33 changes: 33 additions & 0 deletions Lib/email/test/test_email.py
Original file line number Diff line number Diff line change
Expand Up @@ -2450,6 +2450,39 @@ def test_typed_subpart_iterator_default_type(self):
-Me
""")

def test_pushCR_LF(self):
'''FeedParser BufferedSubFile.push() assumed it received complete
line endings. A CR ending one push() followed by a LF starting
the next push() added an empty line.
'''
imt = [
("a\r \n", 2),
("b", 0),
("c\n", 1),
("", 0),
("d\r\n", 1),
("e\r", 0),
("\nf", 1),
("\r\n", 1),
]
from email.feedparser import BufferedSubFile, NeedMoreData
bsf = BufferedSubFile()
om = []
nt = 0
for il, n in imt:
bsf.push(il)
nt += n
n1 = 0
while True:
ol = bsf.readline()
if ol == NeedMoreData:
break
om.append(ol)
n1 += 1
self.assertTrue(n == n1)
self.assertTrue(len(om) == nt)
self.assertTrue(''.join([il for il, n in imt]) == ''.join(om))



class TestParsers(TestEmailBase):
Expand Down
3 changes: 3 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ C-API
Library
-------

- Issue #1555570: email no longer inserts extra blank lines when a \r\n
combo crosses an 8192 byte boundary.

- Issue #9243: Fix sndhdr module and add unit tests, contributed by James Lee.

- ``ast.literal_eval()`` now allows byte literals.
Expand Down

0 comments on commit 6d4a06c

Please sign in to comment.