From: Barry Warsaw <barry@python.org>
Date: Tue, 10 Sep 2002 16:13:45 +0000 (+0000)
Subject: Import _isstring() from the compatibility layer.
X-Git-Tag: v2.3c1~4152
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b1c1de3805590f5f67ed2aedd9bd471c81cca011;p=python

Import _isstring() from the compatibility layer.

_handle_text(): Use _isstring() for stringiness test.

_handle_multipart(): Add a test before the ListType test, checking for
stringiness of the payload.  String payloads for multitypes means a
message with broken MIME chrome was parsed by a lax parser.  Instead
of raising a BoundaryError in those cases, the entire body is assigned
to the message payload (but since the content type is still
multipart/*, the Generator needs to be updated too).
---

diff --git a/Lib/email/Generator.py b/Lib/email/Generator.py
index 8ce380725d..e8bce102ad 100644
--- a/Lib/email/Generator.py
+++ b/Lib/email/Generator.py
@@ -8,11 +8,17 @@ import time
 import re
 import random
 
-from types import ListType, StringType
+from types import ListType
 from cStringIO import StringIO
 
 from email.Header import Header
 
+try:
+    from email._compat22 import _isstring
+except SyntaxError:
+    from email._compat21 import _isstring
+
+
 EMPTYSTRING = ''
 SEMISPACE = '; '
 BAR = '|'
@@ -187,7 +193,7 @@ class Generator:
         cset = msg.get_charset()
         if cset is not None:
             payload = cset.body_encode(payload)
-        if not isinstance(payload, StringType):
+        if not _isstring(payload):
             raise TypeError, 'string payload expected: %s' % type(payload)
         if self._mangle_from_:
             payload = fcre.sub('>From ', payload)
@@ -209,6 +215,10 @@ class Generator:
             print >> self._fp, '\n'
             print >> self._fp, '--' + boundary + '--'
             return
+        elif _isstring(subparts):
+            # e.g. a non-strict parse of a message with no starting boundary.
+            self._fp.write(subparts)
+            return
         elif not isinstance(subparts, ListType):
             # Scalar payload
             subparts = [subparts]