#19063: fix set_payload handling of non-ASCII string input.

This version of the fix raises an error instead of accepting the invalid
input (ie: if a non-ASCII string is used but no charset is specified).
This commit is contained in:
R David Murray 2013-12-11 16:52:11 -05:00
parent 34bd9fc59a
commit 50bfbb9903
6 changed files with 85 additions and 38 deletions

View file

@ -301,9 +301,23 @@ class Message:
Optional charset sets the message's default character set. See
set_charset() for details.
"""
if isinstance(payload, bytes):
payload = payload.decode('ascii', 'surrogateescape')
self._payload = payload
if hasattr(payload, 'encode'):
if charset is None:
try:
payload.encode('ascii', 'surrogateescape')
except UnicodeError:
raise TypeError("charset argument must be specified"
" when non-ASCII characters are used in the"
" payload") from None
self._payload = payload
return
if not isinstance(charset, Charset):
charset = Charset(charset)
payload = payload.encode(charset.output_charset)
if hasattr(payload, 'decode'):
self._payload = payload.decode('ascii', 'surrogateescape')
else:
self._payload = payload
if charset is not None:
self.set_charset(charset)
@ -342,7 +356,7 @@ class Message:
try:
cte(self)
except TypeError:
self._payload = charset.body_encode(self._payload)
self._payload = charset.body_encode(self.get_payload(decode=True))
self.add_header('Content-Transfer-Encoding', cte)
def get_charset(self):