'Verify that *cert* (in decoded format as returned by
SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
rules are followed, but IP addresses are not accepted for *hostname*.
CertificateError is raised on failure. On success, the function
returns nothing.'

def _match_hostname(self, cert, hostname):

    dnsnames = []
    san = cert.get('subjectAltName', ())
    for (key, value) in san:
        if (key == 'DNS'):
            if self._dnsname_match(value, hostname):
                return
            dnsnames.append(value)
    if (not dnsnames):
        for sub in cert.get('subject', ()):
            for (key, value) in sub:
                if (key == 'commonName'):
                    if self._dnsname_match(value, hostname):
                        return
                    dnsnames.append(value)
    if (len(dnsnames) > 1):
        raise CertificateError(("hostname    %r    doesn't    match    either    of    %s" % (hostname, ',    '.join(map(repr, dnsnames)))))
    elif (len(dnsnames) == 1):
        raise CertificateError(("hostname    %r    doesn't    match    %r" % (hostname, dnsnames[0])))
    else:
        raise CertificateError('no    appropriate    commonName    or    subjectAltName    fields    were    found')
