]> granicus.if.org Git - python/commitdiff
Merged revisions 82924 via svnmerge from
authorR. David Murray <rdmurray@bitdance.com>
Sat, 17 Jul 2010 01:40:30 +0000 (01:40 +0000)
committerR. David Murray <rdmurray@bitdance.com>
Sat, 17 Jul 2010 01:40:30 +0000 (01:40 +0000)
svn+ssh://pythondev@svn.python.org/python/branches/release27-maint

................
  r82924 | r.david.murray | 2010-07-16 21:35:16 -0400 (Fri, 16 Jul 2010) | 11 lines

  Merged revisions 82922 via svnmerge from
  svn+ssh://pythondev@svn.python.org/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.
  ........
................

Lib/email/feedparser.py
Lib/email/test/test_email.py
Misc/NEWS

index 163fadafd4ac7e26f7650b0ed71f44d37bc92c6a..5ff266fa30aa45280627dc29a7b2f0b4f730ae86 100644 (file)
@@ -104,6 +104,10 @@ class BufferedSubFile(object):
         # 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.
index 6c23693cf117c715c0d840ed1e2eeca91ac5ab70..9b1287747a4b8fe05da2c1e73fa82dfba744e5fa 100644 (file)
@@ -2445,6 +2445,39 @@ Do you like this message?
 -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))
+
 
 \f
 class TestParsers(TestEmailBase):
index fdd9a42d1253f0cb11136b6fee3110ac37589cf5..0688d0b6ba750048353c08bab4974cd9824959ba 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -81,6 +81,9 @@ C-API
 Library
 -------
 
+- Issue #1555570: email no longer inserts extra blank lines when a \r\n
+  combo crosses an 8192 byte boundary.
+
 - Issue #9164: Ensure sysconfig handles dupblice archs while building on OSX
 
 - Issue #7646: The fnmatch pattern cache no longer grows without bound.