code: func normalizeZone(str string) (zoneAddr, error) {
  	var err error
  
  	// Default to DNS if there isn't a transport protocol prefix.
  	trans := TransportDNS
  
  	switch {
  	case strings.HasPrefix(str, TransportTLS+"://"):
  		trans = TransportTLS
  		str = str[len(TransportTLS+"://"):]
  	case strings.HasPrefix(str, TransportDNS+"://"):
  		trans = TransportDNS
  		str = str[len(TransportDNS+"://"):]
  	case strings.HasPrefix(str, TransportGRPC+"://"):
  		trans = TransportGRPC
  		str = str[len(TransportGRPC+"://"):]
  	}
  
  	host, port, ipnet, err := plugin.SplitHostPort(str)
  	if err != nil {
  		return zoneAddr{}, err
  	}
  
  	if port == "" {
  		if trans == TransportDNS {
  			port = Port
  		}
  		if trans == TransportTLS {
  			port = TLSPort
  		}
  		if trans == TransportGRPC {
  			port = GRPCPort
  		}
  	}
  
  	return zoneAddr{Zone: dns.Fqdn(host), Port: port, Transport: trans, IPNet: ipnet}, nil
  }
docs: // normalizeZone parses an zone string into a structured format with separate
  // host, and port portions, as well as the original input string.