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