summaryrefslogtreecommitdiffstats
path: root/Lib/email/base64mime.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2007-08-30 03:46:43 (GMT)
committerGuido van Rossum <guido@python.org>2007-08-30 03:46:43 (GMT)
commit9604e66660bfe5066a88e3eb560a5846c620e8de (patch)
tree445e4bdae6ea20847bdfa014ebdab7a1b7eb2233 /Lib/email/base64mime.py
parent2c440a1086e182796a52eeca1fe7c2baa441591d (diff)
downloadcpython-9604e66660bfe5066a88e3eb560a5846c620e8de.zip
cpython-9604e66660bfe5066a88e3eb560a5846c620e8de.tar.gz
cpython-9604e66660bfe5066a88e3eb560a5846c620e8de.tar.bz2
Oops. I copied a slightly older version of the email package from the sandbox.
This should restore the email package in the py3k branch to exactly what's in the sandbox. This wipes out 1-2 fixes made post-copy, which I'll re-apply shortly.
Diffstat (limited to 'Lib/email/base64mime.py')
-rw-r--r--Lib/email/base64mime.py105
1 files changed, 27 insertions, 78 deletions
diff --git a/Lib/email/base64mime.py b/Lib/email/base64mime.py
index e309f30..0035b79 100644
--- a/Lib/email/base64mime.py
+++ b/Lib/email/base64mime.py
@@ -25,7 +25,6 @@ module.
"""
__all__ = [
- 'base64_len',
'body_decode',
'body_encode',
'decode',
@@ -33,12 +32,13 @@ __all__ = [
'encode',
'encodestring',
'header_encode',
+ 'header_length',
]
import re
+from base64 import b64encode
from binascii import b2a_base64, a2b_base64
-from email.utils import fix_eols
CRLF = '\r\n'
NL = '\n'
@@ -50,11 +50,10 @@ MISC_LEN = 7
# Helpers
-def base64_len(s):
+def header_length(bytearray):
"""Return the length of s when it is encoded with base64."""
- groups_of_3, leftover = divmod(len(s), 3)
+ groups_of_3, leftover = divmod(len(bytearray), 3)
# 4 bytes out for each 3 bytes (or nonzero fraction thereof) in.
- # Thanks, Tim!
n = groups_of_3 * 4
if leftover:
n += 4
@@ -62,74 +61,26 @@ def base64_len(s):
-def header_encode(header, charset='iso-8859-1', keep_eols=False,
- maxlinelen=76, eol=NL):
+def header_encode(header_bytes, charset='iso-8859-1'):
"""Encode a single header line with Base64 encoding in a given charset.
- Defined in RFC 2045, this Base64 encoding is identical to normal Base64
- encoding, except that each line must be intelligently wrapped (respecting
- the Base64 encoding), and subsequent lines must start with a space.
-
charset names the character set to use to encode the header. It defaults
- to iso-8859-1.
-
- End-of-line characters (\\r, \\n, \\r\\n) will be automatically converted
- to the canonical email line separator \\r\\n unless the keep_eols
- parameter is True (the default is False).
-
- Each line of the header will be terminated in the value of eol, which
- defaults to "\\n". Set this to "\\r\\n" if you are using the result of
- this function directly in email.
-
- The resulting string will be in the form:
-
- "=?charset?b?WW/5ciBtYXp66XLrIHf8eiBhIGhhbXBzdGHuciBBIFlv+XIgbWF6euly?=\\n
- =?charset?b?6yB3/HogYSBoYW1wc3Rh7nIgQkMgWW/5ciBtYXp66XLrIHf8eiBhIGhh?="
-
- with each line wrapped at, at most, maxlinelen characters (defaults to 76
- characters).
+ to iso-8859-1. Base64 encoding is defined in RFC 2045.
"""
# Return empty headers unchanged
- if not header:
- return header
-
- if not keep_eols:
- header = fix_eols(header)
-
- # Base64 encode each line, in encoded chunks no greater than maxlinelen in
- # length, after the RFC chrome is added in.
- base64ed = []
- max_encoded = maxlinelen - len(charset) - MISC_LEN
- max_unencoded = max_encoded * 3 // 4
-
- for i in range(0, len(header), max_unencoded):
- base64ed.append(b2a_base64(header[i:i+max_unencoded]))
-
- # Now add the RFC chrome to each encoded chunk
- lines = []
- for line in base64ed:
- # Ignore the last character of each line if it is a newline
- if line[-1] == ord(NL):
- line = line[:-1]
- # Add the chrome
- lines.append('=?%s?b?%s?=' % (charset, line))
- # Glue the lines together and return it. BAW: should we be able to
- # specify the leading whitespace in the joiner?
- joiner = eol + ' '
- return joiner.join(lines)
+ if not header_bytes:
+ return str(header_bytes)
+ encoded = b64encode(header_bytes)
+ return '=?%s?b?%s?=' % (charset, encoded)
-def encode(s, binary=True, maxlinelen=76, eol=NL):
+def body_encode(s, maxlinelen=76, eol=NL):
"""Encode a string with base64.
Each line will be wrapped at, at most, maxlinelen characters (defaults to
76 characters).
- If binary is False, end-of-line characters will be converted to the
- canonical email end-of-line sequence \\r\\n. Otherwise they will be left
- verbatim (this is the default).
-
Each line of encoded text will end with eol, which defaults to "\\n". Set
this to "\r\n" if you will be using the result of this function directly
in an email.
@@ -137,9 +88,6 @@ def encode(s, binary=True, maxlinelen=76, eol=NL):
if not s:
return s
- if not binary:
- s = fix_eols(s)
-
encvec = []
max_unencoded = maxlinelen * 3 // 4
for i in range(0, len(s), max_unencoded):
@@ -152,25 +100,26 @@ def encode(s, binary=True, maxlinelen=76, eol=NL):
return EMPTYSTRING.join(encvec)
-# For convenience and backwards compatibility w/ standard base64 module
-body_encode = encode
-encodestring = encode
-
-
-def decode(string):
+def decode(s, convert_eols=False):
"""Decode a raw base64 string, returning a bytes object.
- This function does not parse a full MIME header value encoded with base64
- (like =?iso-8895-1?b?bmloISBuaWgh?=) -- use the high level
- email.Header class for that functionality.
+ If convert_eols is set to a string value, all canonical email linefeeds,
+ e.g. "\\r\\n", in the decoded text will be converted to the value of
+ convert_eols. os.linesep is a good choice for convert_eols if you are
+ decoding a text attachment.
+
+ This function does not parse a full MIME header value encoded with
+ base64 (like =?iso-8895-1?b?bmloISBuaWgh?=) -- please use the high
+ level email.Header class for that functionality.
"""
- if not string:
- return bytes()
- elif isinstance(string, str):
- return a2b_base64(string.encode('raw-unicode-escape'))
- else:
- return a2b_base64(string)
+ if not s:
+ return s
+
+ dec = a2b_base64(s)
+ if convert_eols:
+ return dec.replace(CRLF, convert_eols)
+ return dec
# For convenience and backwards compatibility w/ standard base64 module