_write_headers(), _split_header(): All of the smarts for splitting

long header lines is now (properly) in the Header class.  So we no
longer need _split_header() and we'll just defer to Header.encode()
when we have a plain string.
This commit is contained in:
Barry Warsaw 2003-03-07 15:43:17 +00:00
parent 9f3fcd9c23
commit ce6bf59b2d
1 changed files with 20 additions and 35 deletions

View File

@ -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
#