summaryrefslogtreecommitdiffstats
path: root/Lib/dos_8x3/mimetool.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1996-07-22 15:23:25 (GMT)
committerGuido van Rossum <guido@python.org>1996-07-22 15:23:25 (GMT)
commit5c971677a5433aff7c1150e39bde222c24c26f39 (patch)
tree64d0b425bebe8c8a74d6ce51bc4a61817ef388f9 /Lib/dos_8x3/mimetool.py
parentad8b3baa919f5ab1201fca0e608905851f24e967 (diff)
downloadcpython-5c971677a5433aff7c1150e39bde222c24c26f39.zip
cpython-5c971677a5433aff7c1150e39bde222c24c26f39.tar.gz
cpython-5c971677a5433aff7c1150e39bde222c24c26f39.tar.bz2
Fuck. For PC support, this must be in the distribution.
Diffstat (limited to 'Lib/dos_8x3/mimetool.py')
-rwxr-xr-xLib/dos_8x3/mimetool.py187
1 files changed, 187 insertions, 0 deletions
diff --git a/Lib/dos_8x3/mimetool.py b/Lib/dos_8x3/mimetool.py
new file mode 100755
index 0000000..da33a77
--- /dev/null
+++ b/Lib/dos_8x3/mimetool.py
@@ -0,0 +1,187 @@
+# Various tools used by MIME-reading or MIME-writing programs.
+
+
+import os
+import rfc822
+import string
+import tempfile
+
+
+# A derived class of rfc822.Message that knows about MIME headers and
+# contains some hooks for decoding encoded and multipart messages.
+
+class Message(rfc822.Message):
+
+ def __init__(self, fp, seekable = 1):
+ rfc822.Message.__init__(self, fp, seekable)
+ self.encodingheader = \
+ self.getheader('content-transfer-encoding')
+ self.typeheader = \
+ self.getheader('content-type')
+ self.parsetype()
+ self.parseplist()
+
+ def parsetype(self):
+ str = self.typeheader
+ if str == None:
+ str = 'text/plain'
+ if ';' in str:
+ i = string.index(str, ';')
+ self.plisttext = str[i:]
+ str = str[:i]
+ else:
+ self.plisttext = ''
+ fields = string.splitfields(str, '/')
+ for i in range(len(fields)):
+ fields[i] = string.lower(string.strip(fields[i]))
+ self.type = string.joinfields(fields, '/')
+ self.maintype = fields[0]
+ self.subtype = string.joinfields(fields[1:], '/')
+
+ def parseplist(self):
+ str = self.plisttext
+ self.plist = []
+ while str[:1] == ';':
+ str = str[1:]
+ if ';' in str:
+ # XXX Should parse quotes!
+ end = string.index(str, ';')
+ else:
+ end = len(str)
+ f = str[:end]
+ if '=' in f:
+ i = string.index(f, '=')
+ f = string.lower(string.strip(f[:i])) + \
+ '=' + string.strip(f[i+1:])
+ self.plist.append(string.strip(f))
+ str = str[end:]
+
+ def getplist(self):
+ return self.plist
+
+ def getparam(self, name):
+ name = string.lower(name) + '='
+ n = len(name)
+ for p in self.plist:
+ if p[:n] == name:
+ return rfc822.unquote(p[n:])
+ return None
+
+ def getencoding(self):
+ if self.encodingheader == None:
+ return '7bit'
+ return string.lower(self.encodingheader)
+
+ def gettype(self):
+ return self.type
+
+ def getmaintype(self):
+ return self.maintype
+
+ def getsubtype(self):
+ return self.subtype
+
+
+
+
+# Utility functions
+# -----------------
+
+
+# Return a random string usable as a multipart boundary.
+# The method used is so that it is *very* unlikely that the same
+# string of characters will every occur again in the Universe,
+# so the caller needn't check the data it is packing for the
+# occurrence of the boundary.
+#
+# The boundary contains dots so you have to quote it in the header.
+
+_prefix = None
+
+def choose_boundary():
+ global _prefix
+ import time
+ import rand
+ if _prefix == None:
+ import socket
+ import os
+ hostid = socket.gethostbyname(socket.gethostname())
+ uid = `os.getuid()`
+ pid = `os.getpid()`
+ seed = `rand.rand()`
+ _prefix = hostid + '.' + uid + '.' + pid
+ timestamp = `int(time.time())`
+ seed = `rand.rand()`
+ return _prefix + '.' + timestamp + '.' + seed
+
+
+# Subroutines for decoding some common content-transfer-types
+
+# XXX This requires that uudecode and mmencode are in $PATH
+
+def decode(input, output, encoding):
+ if decodetab.has_key(encoding):
+ pipethrough(input, decodetab[encoding], output)
+ else:
+ raise ValueError, \
+ 'unknown Content-Transfer-Encoding: %s' % encoding
+
+def encode(input, output, encoding):
+ if encodetab.has_key(encoding):
+ pipethrough(input, encodetab[encoding], output)
+ else:
+ raise ValueError, \
+ 'unknown Content-Transfer-Encoding: %s' % encoding
+
+uudecode_pipe = '''(
+TEMP=/tmp/@uu.$$
+sed "s%^begin [0-7][0-7]* .*%begin 600 $TEMP%" | uudecode
+cat $TEMP
+rm $TEMP
+)'''
+
+decodetab = {
+ 'uuencode': uudecode_pipe,
+ 'x-uuencode': uudecode_pipe,
+ 'quoted-printable': 'mmencode -u -q',
+ 'base64': 'mmencode -u -b',
+}
+
+encodetab = {
+ 'x-uuencode': 'uuencode tempfile',
+ 'uuencode': 'uuencode tempfile',
+ 'quoted-printable': 'mmencode -q',
+ 'base64': 'mmencode -b',
+}
+
+def pipeto(input, command):
+ pipe = os.popen(command, 'w')
+ copyliteral(input, pipe)
+ pipe.close()
+
+def pipethrough(input, command, output):
+ tempname = tempfile.mktemp()
+ try:
+ temp = open(tempname, 'w')
+ except IOError:
+ print '*** Cannot create temp file', `tempname`
+ return
+ copyliteral(input, temp)
+ temp.close()
+ pipe = os.popen(command + ' <' + tempname, 'r')
+ copybinary(pipe, output)
+ pipe.close()
+ os.unlink(tempname)
+
+def copyliteral(input, output):
+ while 1:
+ line = input.readline()
+ if not line: break
+ output.write(line)
+
+def copybinary(input, output):
+ BUFSIZE = 8192
+ while 1:
+ line = input.read(BUFSIZE)
+ if not line: break
+ output.write(line)