summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorR. David Murray <rdmurray@bitdance.com>2011-01-07 21:57:25 +0000
committerR. David Murray <rdmurray@bitdance.com>2011-01-07 21:57:25 +0000
commit6f0022d84af15d51ffa1606991f2b6e9e56448ed (patch)
treea47fdc84c7487741c7f07b3612f96e70facd677f
parent7088abdca6c3e1285c66f51fe907e6c3446773ed (diff)
downloadcpython-git-6f0022d84af15d51ffa1606991f2b6e9e56448ed.tar.gz
Fix formatting of values with embedded newlines when rfc2047 encoding
Before this patch if a value being encoded had an embedded newline, the line following the newline would have no leading whitespace, and the whitespace it did have was encoded into the word. Now the existing whitespace gets turned into a blank, the way it does in other header reformatting, and the _continuation_ws gets added at the beginning of the encoded line.
-rw-r--r--Lib/email/header.py11
-rw-r--r--Lib/email/test/test_email.py13
-rw-r--r--Misc/NEWS6
3 files changed, 26 insertions, 4 deletions
diff --git a/Lib/email/header.py b/Lib/email/header.py
index 94eb1a94aa..d462bf008f 100644
--- a/Lib/email/header.py
+++ b/Lib/email/header.py
@@ -305,10 +305,15 @@ class Header:
self._continuation_ws, splitchars)
for string, charset in self._chunks:
lines = string.splitlines()
- for line in lines:
+ formatter.feed(lines[0], charset)
+ for line in lines[1:]:
+ formatter.newline()
+ if charset.header_encoding is not None:
+ formatter.feed(self._continuation_ws, USASCII)
+ line = ' ' + line.lstrip()
formatter.feed(line, charset)
- if len(lines) > 1:
- formatter.newline()
+ if len(lines) > 1:
+ formatter.newline()
formatter.add_transition()
return formatter._str(linesep)
diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py
index e7fcee3b6d..4855371d1b 100644
--- a/Lib/email/test/test_email.py
+++ b/Lib/email/test/test_email.py
@@ -968,6 +968,19 @@ List: List-Unsubscribe: <http://lists.sourceforge.net/lists/listinfo/spamassassi
""")
+ def test_long_rfc2047_header_with_embedded_fws(self):
+ h = Header(textwrap.dedent("""\
+ We're going to pretend this header is in a non-ascii character set
+ \tto see if line wrapping with encoded words and embedded
+ folding white space works"""),
+ charset='utf-8',
+ header_name='Test')
+ self.assertEqual(h.encode()+'\n', textwrap.dedent("""\
+ =?utf-8?q?We=27re_going_to_pretend_this_header_is_in_a_non-ascii_chara?=
+ =?utf-8?q?cter_set?=
+ =?utf-8?q?_to_see_if_line_wrapping_with_encoded_words_and_embedded?=
+ =?utf-8?q?_folding_white_space_works?=""")+'\n')
+
# Test mangling of "From " lines in the body of a message
diff --git a/Misc/NEWS b/Misc/NEWS
index 1865aa84ab..5361574873 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -40,6 +40,11 @@ Core and Builtins
Library
-------
+- email.header.Header was incorrectly encoding folding white space when
+ rfc2047-encoding header values with embedded newlines, leaving them
+ without folding whitespace. It now uses the continuation_ws, as it
+ does for continuation lines that it creates itself.
+
- Issue #10827: Changed the rules for 2-digit years. The time.asctime
function will now format any year when ``time.accept2dyear`` is
false and will accept years >= 1000 otherwise. The year range
@@ -47,7 +52,6 @@ Library
dependent, but ``time.mktime`` will now accept full range supported
by the OS. Conversion of 2-digit years to 4-digit is deprecated.
-
- Issue #7858: Raise an error properly when os.utime() fails under Windows
on an existing file.