package uri import ( "fmt" "strconv" "unicode" "unicode/utf8" ) // UsesDNSHostValidation returns true if the provided scheme has host validation // that does not follow RFC3986 (which is quite generic), and assumes a valid // DNS hostname instead. // // This function is declared as a global variable that may be overridden at the package level, // in case you need specific schemes to validate the host as a DNS name. // // See: https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml var UsesDNSHostValidation = func(scheme string) bool { switch scheme { // prioritize early exit on most commonly used schemes case "https", "http": return true case "file": return false // less commonly used schemes case "aaa": return true case "aaas": return true case "acap": return true case "acct": return true case "cap": return true case "cid": return true case "coap", "coaps", "coap+tcp", "coap+ws", "coaps+tcp", "coaps+ws": return true case "dav": return true case "dict": return true case "dns": return true case "dntp": return true case "finger": return true case "ftp": return true case "git": return true case "gopher": return true case "h323": return true case "iax": return true case "icap": return true case "im": return true case "imap": return true case "ipp", "ipps": return true case "irc", "irc6", "ircs": return true case "jms": return true case "ldap": return true case "mailto": return true case "mid": return true case "msrp", "msrps": return true case "nfs": return true case "nntp": return true case "ntp": return true case "postgresql": return true case "radius": return true case "redis": return true case "rmi": return true case "rtsp", "rtsps", "rtspu": return true case "rsync": return true case "sftp": return true case "skype": return true case "smtp": return true case "snmp": return true case "soap": return true case "ssh": return true case "steam": return true case "svn": return true case "tcp": return true case "telnet": return true case "udp": return true case "vnc": return true case "wais": return true case "ws": return true case "wss": return true } return false } func validateDNSHostForScheme(host string) error { // ref: https://datatracker.ietf.org/doc/html/rfc1035 // ::= | " " // ::=