'Guess the type of a file based on its URL.
Return value is a tuple (type, encoding) where type is None if
the type can\'t be guessed (no or unknown suffix) or a string
of the form type/subtype, usable for a MIME Content-type
header; and encoding is None for no encoding or the name of
the program used to encode (e.g. compress or gzip).  The
mappings are table driven.  Encoding suffixes are case
sensitive; type suffixes are first tried case sensitive, then
case insensitive.
The suffixes .tgz, .taz and .tz (case sensitive!) are all
mapped to \'.tar.gz\'.  (This is table-driven too, using the
dictionary suffix_map.)
Optional `strict\' argument when False adds a bunch of commonly found,
but non-standard types.'

def guess_type(self, url, strict=True):

    (scheme, url) = urllib.parse.splittype(url)
    if (scheme == 'data'):
        comma = url.find(',')
        if (comma < 0):
            return (None, None)
        semi = url.find(';', 0, comma)
        if (semi >= 0):
            type = url[:semi]
        else:
            type = url[:comma]
        if (('=' in type) or ('/' not in type)):
            type = 'text/plain'
        return (type, None)
    (base, ext) = posixpath.splitext(url)
    while (ext in self.suffix_map):
        (base, ext) = posixpath.splitext((base + self.suffix_map[ext]))
    if (ext in self.encodings_map):
        encoding = self.encodings_map[ext]
        (base, ext) = posixpath.splitext(base)
    else:
        encoding = None
    types_map = self.types_map[True]
    if (ext in types_map):
        return (types_map[ext], encoding)
    elif (ext.lower() in types_map):
        return (types_map[ext.lower()], encoding)
    elif strict:
        return (None, encoding)
    types_map = self.types_map[False]
    if (ext in types_map):
        return (types_map[ext], encoding)
    elif (ext.lower() in types_map):
        return (types_map[ext.lower()], encoding)
    else:
        return (None, encoding)
