diff --git a/Lib/email/Generator.py b/Lib/email/Generator.py index 4f455a4284f..9cce51c40b5 100644 --- a/Lib/email/Generator.py +++ b/Lib/email/Generator.py @@ -161,44 +161,29 @@ class Generator: def _write_headers(self, msg): for h, v in msg.items(): - # RFC 2822 says that lines SHOULD be no more than maxheaderlen - # characters wide, so we're well within our rights to split long - # headers. - text = '%s: %s' % (h, v) - if self.__maxheaderlen > 0 and len(text) > self.__maxheaderlen: - text = self._split_header(text) - print >> self._fp, text + print >> self._fp, '%s:' % h, + if self.__maxheaderlen == 0: + # Explicit no-wrapping + print >> self._fp, v + elif isinstance(v, Header): + # Header instances know what to do + print >> self._fp, v.encode() + elif _is8bitstring(v): + # If we have raw 8bit data in a byte string, we have no idea + # what the encoding is. There is no safe way to split this + # string. If it's ascii-subset, then we could do a normal + # ascii split, but if it's multibyte then we could break the + # string. There's no way to know so the least harm seems to + # be to not split the string and risk it being too long. + print >> self._fp, v + else: + # Header's got lots of smarts, so use it. + print >> self._fp, Header( + v, maxlinelen=self.__maxheaderlen, + header_name=h, continuation_ws='\t').encode() # A blank line always separates headers from body print >> self._fp - def _split_header(self, text): - maxheaderlen = self.__maxheaderlen - # Find out whether any lines in the header are really longer than - # maxheaderlen characters wide. There could be continuation lines - # that actually shorten it. Also, replace hard tabs with 8 spaces. - lines = [s.replace('\t', SPACE8) for s in text.splitlines()] - for line in lines: - if len(line) > maxheaderlen: - break - else: - # No line was actually longer than maxheaderlen characters, so - # just return the original unchanged. - return text - # If we have raw 8bit data in a byte string, we have no idea what the - # encoding is. I think there is no safe way to split this string. If - # it's ascii-subset, then we could do a normal ascii split, but if - # it's multibyte then we could break the string. There's no way to - # know so the least harm seems to be to not split the string and risk - # it being too long. - if _is8bitstring(text): - return text - # The `text' argument already has the field name prepended, so don't - # provide it here or the first line will get folded too short. - h = Header(text, maxlinelen=maxheaderlen, - # For backwards compatibility, we use a hard tab here - continuation_ws='\t') - return h.encode() - # # Handlers for writing types and subtypes #