From e58df82919808939f21e9756af65c5afb5d8b2e5 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Wed, 8 Feb 2006 14:34:21 +0000 Subject: Port relevant patches for SF 1409455 to the trunk for email 3.0/Python 2.5. Will port to Python 2.4. --- Lib/email/Charset.py | 4 ++-- Lib/email/Generator.py | 5 +---- Lib/email/Message.py | 3 +++ Lib/email/test/test_email.py | 3 ++- Lib/email/test/test_email_codecs.py | 13 ++++++++++++- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Lib/email/Charset.py b/Lib/email/Charset.py index df860c5..fd4043b 100644 --- a/Lib/email/Charset.py +++ b/Lib/email/Charset.py @@ -1,4 +1,4 @@ -# Copyright (C) 2001-2004 Python Software Foundation +# Copyright (C) 2001-2006 Python Software Foundation # Author: Ben Gertzfield, Barry Warsaw # Contact: email-sig@python.org @@ -206,7 +206,7 @@ class Charset: self.input_codec = CODEC_MAP.get(self.input_charset, self.input_charset) self.output_codec = CODEC_MAP.get(self.output_charset, - self.output_charset) + self.output_charset) def __str__(self): return self.input_charset.lower() diff --git a/Lib/email/Generator.py b/Lib/email/Generator.py index 9411a9e..7969916 100644 --- a/Lib/email/Generator.py +++ b/Lib/email/Generator.py @@ -1,4 +1,4 @@ -# Copyright (C) 2001-2004 Python Software Foundation +# Copyright (C) 2001-2006 Python Software Foundation # Author: Barry Warsaw # Contact: email-sig@python.org @@ -175,9 +175,6 @@ class Generator: payload = msg.get_payload() if payload is None: return - cset = msg.get_charset() - if cset is not None: - payload = cset.body_encode(payload) if not isinstance(payload, basestring): raise TypeError('string payload expected: %s' % type(payload)) if self._mangle_from_: diff --git a/Lib/email/Message.py b/Lib/email/Message.py index 88fd786..bc76416 100644 --- a/Lib/email/Message.py +++ b/Lib/email/Message.py @@ -250,11 +250,14 @@ class Message: charset=charset.get_output_charset()) else: self.set_param('charset', charset.get_output_charset()) + if str(charset) <> charset.get_output_charset(): + self._payload = charset.body_encode(self._payload) if not self.has_key('Content-Transfer-Encoding'): cte = charset.get_body_encoding() try: cte(self) except TypeError: + self._payload = charset.body_encode(self._payload) self.add_header('Content-Transfer-Encoding', cte) def get_charset(self): diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py index cf9f761..5a42c227 100644 --- a/Lib/email/test/test_email.py +++ b/Lib/email/test/test_email.py @@ -2221,7 +2221,8 @@ class TestMiscellaneous(TestEmailBase): charset = Charset(charsets[0]) eq(charset.get_body_encoding(), 'base64') msg.set_payload('hello world', charset=charset) - eq(msg.get_payload(), 'hello world') + eq(msg.get_payload(), 'aGVsbG8gd29ybGQ=\n') + eq(msg.get_payload(decode=True), 'hello world') eq(msg['content-transfer-encoding'], 'base64') # Try another one msg = Message() diff --git a/Lib/email/test/test_email_codecs.py b/Lib/email/test/test_email_codecs.py index 75ef081..159989c 100644 --- a/Lib/email/test/test_email_codecs.py +++ b/Lib/email/test/test_email_codecs.py @@ -1,4 +1,5 @@ -# Copyright (C) 2002 Python Software Foundation +# Copyright (C) 2002-2006 Python Software Foundation +# Contact: email-sig@python.org # email package unit tests for (optional) Asian codecs import unittest @@ -7,6 +8,8 @@ from test.test_support import TestSkipped, run_unittest from email.test.test_email import TestEmailBase from email.Charset import Charset from email.Header import Header, decode_header +from email.Message import Message + class TestEmailAsianCodecs(TestEmailBase): @@ -42,6 +45,14 @@ Hello World! =?iso-2022-jp?b?GyRCJU8lbSE8JW8hPCVrJUkhKhsoQg==?= # TK: full decode comparison eq(h.__unicode__().encode('euc-jp'), long) + def test_payload_encoding(self): + jhello = '\xa5\xcf\xa5\xed\xa1\xbc\xa5\xef\xa1\xbc\xa5\xeb\xa5\xc9\xa1\xaa' + jcode = 'euc-jp' + msg = Message() + msg.set_payload(jhello, jcode) + ustr = unicode(msg.get_payload(), msg.get_content_charset()) + self.assertEqual(jhello, ustr.encode(jcode)) + def suite(): -- cgit v0.12