func idnaASCII(v string) (string, error) { if isASCII(v) { return v, nil } // The idna package doesn't do everything from // https://tools.ietf.org/html/rfc5895 so we do it here. // TODO(bradfitz): should the idna package do this instead? v = strings.ToLower(v) v = width.Fold.String(v) v = norm.NFC.String(v) return idna.ToASCII(v) }
// PunycodeHostPort returns the IDNA Punycode version // of the provided "host" or "host:port" string. func PunycodeHostPort(v string) (string, error) { if isASCII(v) { return v, nil } host, port, err := net.SplitHostPort(v) if err != nil { // The input 'v' argument was just a "host" argument, // without a port. This error should not be returned // to the caller. host = v port = "" } host, err = idna.ToASCII(host) if err != nil { // Non-UTF-8? Not representable in Punycode, in any // case. return "", err } if port == "" { return host, nil } return net.JoinHostPort(host, port), nil }