17db96d56Sopenharmony_ci# Copyright (C) 2001-2006 Python Software Foundation
27db96d56Sopenharmony_ci# Author: Barry Warsaw
37db96d56Sopenharmony_ci# Contact: email-sig@python.org
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ci"""Encodings and related functions."""
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci__all__ = [
87db96d56Sopenharmony_ci    'encode_7or8bit',
97db96d56Sopenharmony_ci    'encode_base64',
107db96d56Sopenharmony_ci    'encode_noop',
117db96d56Sopenharmony_ci    'encode_quopri',
127db96d56Sopenharmony_ci    ]
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_cifrom base64 import encodebytes as _bencode
167db96d56Sopenharmony_cifrom quopri import encodestring as _encodestring
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_cidef _qencode(s):
217db96d56Sopenharmony_ci    enc = _encodestring(s, quotetabs=True)
227db96d56Sopenharmony_ci    # Must encode spaces, which quopri.encodestring() doesn't do
237db96d56Sopenharmony_ci    return enc.replace(b' ', b'=20')
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_cidef encode_base64(msg):
277db96d56Sopenharmony_ci    """Encode the message's payload in Base64.
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci    Also, add an appropriate Content-Transfer-Encoding header.
307db96d56Sopenharmony_ci    """
317db96d56Sopenharmony_ci    orig = msg.get_payload(decode=True)
327db96d56Sopenharmony_ci    encdata = str(_bencode(orig), 'ascii')
337db96d56Sopenharmony_ci    msg.set_payload(encdata)
347db96d56Sopenharmony_ci    msg['Content-Transfer-Encoding'] = 'base64'
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_cidef encode_quopri(msg):
397db96d56Sopenharmony_ci    """Encode the message's payload in quoted-printable.
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci    Also, add an appropriate Content-Transfer-Encoding header.
427db96d56Sopenharmony_ci    """
437db96d56Sopenharmony_ci    orig = msg.get_payload(decode=True)
447db96d56Sopenharmony_ci    encdata = _qencode(orig)
457db96d56Sopenharmony_ci    msg.set_payload(encdata)
467db96d56Sopenharmony_ci    msg['Content-Transfer-Encoding'] = 'quoted-printable'
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_cidef encode_7or8bit(msg):
517db96d56Sopenharmony_ci    """Set the Content-Transfer-Encoding header to 7bit or 8bit."""
527db96d56Sopenharmony_ci    orig = msg.get_payload(decode=True)
537db96d56Sopenharmony_ci    if orig is None:
547db96d56Sopenharmony_ci        # There's no payload.  For backwards compatibility we use 7bit
557db96d56Sopenharmony_ci        msg['Content-Transfer-Encoding'] = '7bit'
567db96d56Sopenharmony_ci        return
577db96d56Sopenharmony_ci    # We play a trick to make this go fast.  If decoding from ASCII succeeds,
587db96d56Sopenharmony_ci    # we know the data must be 7bit, otherwise treat it as 8bit.
597db96d56Sopenharmony_ci    try:
607db96d56Sopenharmony_ci        orig.decode('ascii')
617db96d56Sopenharmony_ci    except UnicodeError:
627db96d56Sopenharmony_ci        msg['Content-Transfer-Encoding'] = '8bit'
637db96d56Sopenharmony_ci    else:
647db96d56Sopenharmony_ci        msg['Content-Transfer-Encoding'] = '7bit'
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_cidef encode_noop(msg):
697db96d56Sopenharmony_ci    """Do nothing."""
70