Kaydet (Commit) 523b41c4 authored tarafından R David Murray's avatar R David Murray

Merge #11590: fix quoprimime decode handling of empty strings and line endings.

...@@ -135,9 +135,9 @@ def header_encode(header_bytes, charset='iso-8859-1'): ...@@ -135,9 +135,9 @@ def header_encode(header_bytes, charset='iso-8859-1'):
charset names the character set to use in the RFC 2046 header. It charset names the character set to use in the RFC 2046 header. It
defaults to iso-8859-1. defaults to iso-8859-1.
""" """
# Return empty headers unchanged # Return empty headers as an empty string.
if not header_bytes: if not header_bytes:
return str(header_bytes) return ''
# Iterate over every byte, encoding if necessary. # Iterate over every byte, encoding if necessary.
encoded = [] encoded = []
for octet in header_bytes: for octet in header_bytes:
...@@ -268,7 +268,7 @@ def decode(encoded, eol=NL): ...@@ -268,7 +268,7 @@ def decode(encoded, eol=NL):
if i == n: if i == n:
decoded += eol decoded += eol
# Special case if original string did not end with eol # Special case if original string did not end with eol
if not encoded.endswith(eol) and decoded.endswith(eol): if encoded[-1] not in '\r\n' and decoded.endswith(eol):
decoded = decoded[:-1] decoded = decoded[:-1]
return decoded return decoded
......
...@@ -3344,6 +3344,9 @@ class TestQuopri(unittest.TestCase): ...@@ -3344,6 +3344,9 @@ class TestQuopri(unittest.TestCase):
encoded_header = quoprimime.header_encode(header, charset) encoded_header = quoprimime.header_encode(header, charset)
self.assertEqual(encoded_header, expected_encoded_header) self.assertEqual(encoded_header, expected_encoded_header)
def test_header_encode_null(self):
self._test_header_encode(b'', '')
def test_header_encode_one_word(self): def test_header_encode_one_word(self):
self._test_header_encode(b'hello', '=?iso-8859-1?q?hello?=') self._test_header_encode(b'hello', '=?iso-8859-1?q?hello?=')
...@@ -3400,6 +3403,15 @@ class TestQuopri(unittest.TestCase): ...@@ -3400,6 +3403,15 @@ class TestQuopri(unittest.TestCase):
def test_decode_one_line_lf(self): def test_decode_one_line_lf(self):
self._test_decode('hello\n', 'hello\n') self._test_decode('hello\n', 'hello\n')
def test_decode_one_line_cr(self):
self._test_decode('hello\r', 'hello\n')
def test_decode_one_line_nl(self):
self._test_decode('hello\n', 'helloX', eol='X')
def test_decode_one_line_crnl(self):
self._test_decode('hello\r\n', 'helloX', eol='X')
def test_decode_one_line_one_word(self): def test_decode_one_line_one_word(self):
self._test_decode('hello\r\nworld', 'hello\nworld') self._test_decode('hello\r\nworld', 'hello\nworld')
...@@ -3409,6 +3421,9 @@ class TestQuopri(unittest.TestCase): ...@@ -3409,6 +3421,9 @@ class TestQuopri(unittest.TestCase):
def test_decode_two_lines(self): def test_decode_two_lines(self):
self._test_decode('hello\r\nworld\r\n', 'hello\nworld\n') self._test_decode('hello\r\nworld\r\n', 'hello\nworld\n')
def test_decode_two_lines_eol(self):
self._test_decode('hello\r\nworld\r\n', 'helloXworldX', eol='X')
def test_decode_one_long_line(self): def test_decode_one_long_line(self):
self._test_decode('Spam' * 250, 'Spam' * 250) self._test_decode('Spam' * 250, 'Spam' * 250)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment