1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Copyright (C) 2001-2006 Python Software Foundation 2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Author: Barry Warsaw 3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Contact: email-sig@python.org 4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh"""Encodings and related functions.""" 6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh__all__ = [ 8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'encode_7or8bit', 9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'encode_base64', 10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'encode_noop', 11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 'encode_quopri', 12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh ] 13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport base64 15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom quopri import encodestring as _encodestring 17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef _qencode(s): 21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh enc = _encodestring(s, quotetabs=True) 22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # Must encode spaces, which quopri.encodestring() doesn't do 23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return enc.replace(' ', '=20') 24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef _bencode(s): 27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # We can't quite use base64.encodestring() since it tacks on a "courtesy 28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # newline". Blech! 29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not s: 30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return s 31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh hasnewline = (s[-1] == '\n') 32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh value = base64.encodestring(s) 33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if not hasnewline and value[-1] == '\n': 34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return value[:-1] 35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return value 36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef encode_base64(msg): 40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Encode the message's payload in Base64. 41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh Also, add an appropriate Content-Transfer-Encoding header. 43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """ 44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh orig = msg.get_payload() 45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh encdata = _bencode(orig) 46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh msg.set_payload(encdata) 47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh msg['Content-Transfer-Encoding'] = 'base64' 48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef encode_quopri(msg): 52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Encode the message's payload in quoted-printable. 53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh Also, add an appropriate Content-Transfer-Encoding header. 55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """ 56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh orig = msg.get_payload() 57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh encdata = _qencode(orig) 58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh msg.set_payload(encdata) 59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh msg['Content-Transfer-Encoding'] = 'quoted-printable' 60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef encode_7or8bit(msg): 64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Set the Content-Transfer-Encoding header to 7bit or 8bit.""" 65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh orig = msg.get_payload() 66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if orig is None: 67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # There's no payload. For backwards compatibility we use 7bit 68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh msg['Content-Transfer-Encoding'] = '7bit' 69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh return 70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # We play a trick to make this go fast. If encoding to ASCII succeeds, we 71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # know the data must be 7bit, otherwise treat it as 8bit. 72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh orig.encode('ascii') 74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except UnicodeError: 75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh msg['Content-Transfer-Encoding'] = '8bit' 76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh msg['Content-Transfer-Encoding'] = '7bit' 78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef encode_noop(msg): 82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh """Do nothing.""" 83