From 00b34228bb98c378286c0b72a4a4098d5cdd384b Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Fri, 31 Aug 2007 02:35:00 +0000 Subject: [PATCH] More email package fixes. This repairs the linear whitespace insertion between RFC 2047 encoded words without leaving bogus trailing spaces at the end lines that end in encoded words. Current status: 7F/9E --- Lib/email/header.py | 28 +++++++++++++++------------- Lib/email/test/test_email.py | 2 +- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Lib/email/header.py b/Lib/email/header.py index 786a71f6472..cc6b2789a07 100644 --- a/Lib/email/header.py +++ b/Lib/email/header.py @@ -29,7 +29,6 @@ MAXLINELEN = 78 USASCII = Charset('us-ascii') UTF8 = Charset('utf-8') -TRANSITIONAL_SPACE = object() # Match encoded-word strings in the form =?charset?q?Hello_World?= ecre = re.compile(r''' @@ -309,6 +308,7 @@ class Header: formatter.feed(line, charset) if len(lines) > 1: formatter.newline() + formatter.add_transition() return str(formatter) def _normalize(self): @@ -341,19 +341,20 @@ class _ValueFormatter: self._current_line = _Accumulator(headerlen) def __str__(self): - # Remove any trailing TRANSITIONAL_SPACE - if len(self._current_line) > 0: - last_line = self._current_line.pop() - if last_line is not TRANSITIONAL_SPACE: - self._current_line.push(last_line) self.newline() return NL.join(self._lines) def newline(self): + end_of_line = self._current_line.pop() + if end_of_line is not None: + self._current_line.push(end_of_line) if len(self._current_line) > 0: self._lines.append(str(self._current_line)) self._current_line.reset() + def add_transition(self): + self._current_line.push(None) + def feed(self, string, charset): # If the string itself fits on the current line in its encoded format, # then add it now and be done with it. @@ -408,7 +409,6 @@ class _ValueFormatter: # There was only one line. return self._current_line.push(last_line) - self._current_line.push(TRANSITIONAL_SPACE) # Everything else are full lines in themselves. for line in encoded_lines: self._lines.append(self._continuation_ws + line) @@ -554,18 +554,20 @@ class _Accumulator: self._current.append(string) def pop(self): + if not self._current: + return None return self._current.pop() def __len__(self): - return sum((len(string) - for string in self._current - if string is not TRANSITIONAL_SPACE), + return sum(((1 if string is None else len(string)) + for string in self._current), self._initial_size) def __str__(self): - return EMPTYSTRING.join( - (' ' if string is TRANSITIONAL_SPACE else string) - for string in self._current) + if self._current and self._current[-1] is None: + self._current.pop() + return EMPTYSTRING.join((' ' if string is None else string) + for string in self._current) def reset(self, string=None): self._current = [] diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py index 324332b24cf..ef11e1730ef 100644 --- a/Lib/email/test/test_email.py +++ b/Lib/email/test/test_email.py @@ -1556,7 +1556,7 @@ class TestRFC2047(TestEmailBase): header = make_header(dh) eq(str(header), 'Re: r\xe4ksm\xf6rg\xe5s baz foo bar r\xe4ksm\xf6rg\xe5s') - self.ndiffAssertEqual(header.encode(), """\ + self.ndiffAssertEqual(header.encode(maxlinelen=76), """\ Re: =?mac-iceland?q?r=8Aksm=9Arg=8Cs?= baz foo bar =?mac-iceland?q?r=8Aksm?= =?mac-iceland?q?=9Arg=8Cs?=""")