xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/email/encoders.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Worker# Copyright (C) 2001-2006 Python Software Foundation
2*cda5da8dSAndroid Build Coastguard Worker# Author: Barry Warsaw
3*cda5da8dSAndroid Build Coastguard Worker# Contact: [email protected]
4*cda5da8dSAndroid Build Coastguard Worker
5*cda5da8dSAndroid Build Coastguard Worker"""Encodings and related functions."""
6*cda5da8dSAndroid Build Coastguard Worker
7*cda5da8dSAndroid Build Coastguard Worker__all__ = [
8*cda5da8dSAndroid Build Coastguard Worker    'encode_7or8bit',
9*cda5da8dSAndroid Build Coastguard Worker    'encode_base64',
10*cda5da8dSAndroid Build Coastguard Worker    'encode_noop',
11*cda5da8dSAndroid Build Coastguard Worker    'encode_quopri',
12*cda5da8dSAndroid Build Coastguard Worker    ]
13*cda5da8dSAndroid Build Coastguard Worker
14*cda5da8dSAndroid Build Coastguard Worker
15*cda5da8dSAndroid Build Coastguard Workerfrom base64 import encodebytes as _bencode
16*cda5da8dSAndroid Build Coastguard Workerfrom quopri import encodestring as _encodestring
17*cda5da8dSAndroid Build Coastguard Worker
18*cda5da8dSAndroid Build Coastguard Worker
19*cda5da8dSAndroid Build Coastguard Worker
20*cda5da8dSAndroid Build Coastguard Workerdef _qencode(s):
21*cda5da8dSAndroid Build Coastguard Worker    enc = _encodestring(s, quotetabs=True)
22*cda5da8dSAndroid Build Coastguard Worker    # Must encode spaces, which quopri.encodestring() doesn't do
23*cda5da8dSAndroid Build Coastguard Worker    return enc.replace(b' ', b'=20')
24*cda5da8dSAndroid Build Coastguard Worker
25*cda5da8dSAndroid Build Coastguard Worker
26*cda5da8dSAndroid Build Coastguard Workerdef encode_base64(msg):
27*cda5da8dSAndroid Build Coastguard Worker    """Encode the message's payload in Base64.
28*cda5da8dSAndroid Build Coastguard Worker
29*cda5da8dSAndroid Build Coastguard Worker    Also, add an appropriate Content-Transfer-Encoding header.
30*cda5da8dSAndroid Build Coastguard Worker    """
31*cda5da8dSAndroid Build Coastguard Worker    orig = msg.get_payload(decode=True)
32*cda5da8dSAndroid Build Coastguard Worker    encdata = str(_bencode(orig), 'ascii')
33*cda5da8dSAndroid Build Coastguard Worker    msg.set_payload(encdata)
34*cda5da8dSAndroid Build Coastguard Worker    msg['Content-Transfer-Encoding'] = 'base64'
35*cda5da8dSAndroid Build Coastguard Worker
36*cda5da8dSAndroid Build Coastguard Worker
37*cda5da8dSAndroid Build Coastguard Worker
38*cda5da8dSAndroid Build Coastguard Workerdef encode_quopri(msg):
39*cda5da8dSAndroid Build Coastguard Worker    """Encode the message's payload in quoted-printable.
40*cda5da8dSAndroid Build Coastguard Worker
41*cda5da8dSAndroid Build Coastguard Worker    Also, add an appropriate Content-Transfer-Encoding header.
42*cda5da8dSAndroid Build Coastguard Worker    """
43*cda5da8dSAndroid Build Coastguard Worker    orig = msg.get_payload(decode=True)
44*cda5da8dSAndroid Build Coastguard Worker    encdata = _qencode(orig)
45*cda5da8dSAndroid Build Coastguard Worker    msg.set_payload(encdata)
46*cda5da8dSAndroid Build Coastguard Worker    msg['Content-Transfer-Encoding'] = 'quoted-printable'
47*cda5da8dSAndroid Build Coastguard Worker
48*cda5da8dSAndroid Build Coastguard Worker
49*cda5da8dSAndroid Build Coastguard Worker
50*cda5da8dSAndroid Build Coastguard Workerdef encode_7or8bit(msg):
51*cda5da8dSAndroid Build Coastguard Worker    """Set the Content-Transfer-Encoding header to 7bit or 8bit."""
52*cda5da8dSAndroid Build Coastguard Worker    orig = msg.get_payload(decode=True)
53*cda5da8dSAndroid Build Coastguard Worker    if orig is None:
54*cda5da8dSAndroid Build Coastguard Worker        # There's no payload.  For backwards compatibility we use 7bit
55*cda5da8dSAndroid Build Coastguard Worker        msg['Content-Transfer-Encoding'] = '7bit'
56*cda5da8dSAndroid Build Coastguard Worker        return
57*cda5da8dSAndroid Build Coastguard Worker    # We play a trick to make this go fast.  If decoding from ASCII succeeds,
58*cda5da8dSAndroid Build Coastguard Worker    # we know the data must be 7bit, otherwise treat it as 8bit.
59*cda5da8dSAndroid Build Coastguard Worker    try:
60*cda5da8dSAndroid Build Coastguard Worker        orig.decode('ascii')
61*cda5da8dSAndroid Build Coastguard Worker    except UnicodeError:
62*cda5da8dSAndroid Build Coastguard Worker        msg['Content-Transfer-Encoding'] = '8bit'
63*cda5da8dSAndroid Build Coastguard Worker    else:
64*cda5da8dSAndroid Build Coastguard Worker        msg['Content-Transfer-Encoding'] = '7bit'
65*cda5da8dSAndroid Build Coastguard Worker
66*cda5da8dSAndroid Build Coastguard Worker
67*cda5da8dSAndroid Build Coastguard Worker
68*cda5da8dSAndroid Build Coastguard Workerdef encode_noop(msg):
69*cda5da8dSAndroid Build Coastguard Worker    """Do nothing."""
70