code: def parse_general_name(name):
      name = force_text(name)
      typ = None
      match = GENERAL_NAME_RE.match(name)
      if match is not None:
          typ, name = match.groups()
          typ = typ.lower()
      if typ is None:
          if re.match('[a-z0-9]{2,}://', name):
              try:
                  return x509.UniformResourceIdentifier(name)
              except Exception:
                  pass
          if '@' in name:
              try:
                  return x509.RFC822Name(validate_email(name))
              except Exception:
                  pass
          if name.strip().startswith('/'):
              return x509.DirectoryName(x509_name(name))
          try:
              return x509.IPAddress(ip_address(name))
          except ValueError:
              pass
          try:
              return x509.IPAddress(ip_network(name))
          except ValueError:
              pass
          if name.startswith('*.'):
              idna.encode(name[2:])
          elif name.startswith('.'):
              idna.encode(name[1:])
          else:
              idna.encode(name)
          return x509.DNSName(name)
      if typ == 'uri':
          return x509.UniformResourceIdentifier(name)
      elif typ == 'email':
          return x509.RFC822Name(validate_email(name))
      elif typ == 'ip':
          try:
              return x509.IPAddress(ip_address(name))
          except ValueError:
              pass
          try:
              return x509.IPAddress(ip_network(name))
          except ValueError:
              pass
          raise ValueError('Could not parse IP address.')
      elif typ == 'rid':
          return x509.RegisteredID(x509.ObjectIdentifier(name))
      elif typ == 'othername':
          regex = "(.*);(.*):(.*)"
          if re.match(regex, name) is not None:
              oid, asn_typ, val = re.match(regex, name).groups()
              oid = x509.ObjectIdentifier(oid)
              if asn_typ == 'UTF8':
                  val = val.encode('utf-8')
              elif asn_typ == 'OctetString':
                  val = bytes(bytearray.fromhex(val))
                  val = OctetString(val).dump()
              else:
                  raise ValueError('Unsupported ASN type in otherName: %s' % asn_typ)
              val = force_bytes(val)
              return x509.OtherName(oid, val)
          else:
              raise ValueError('Incorrect otherName format: %s' % name)
      elif typ == 'dirname':
          return x509.DirectoryName(x509_name(name))
      else:
          if name.startswith('*.'):
              idna.encode(name[2:])
          elif name.startswith('.'):
              idna.encode(name[1:])
          else:
              idna.encode(name)
          return x509.DNSName(name)