12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- package utils
- import "net"
- func isValidIP(ip string) bool {
- return net.ParseIP(ip) != nil
- }
- func IsAlphaNumeric(c byte) bool {
- return 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9'
- }
- //This function is lifted from go source
- //See https://github.com/golang/go/blob/master/src/net/dnsclient.go#L75
- func isValidHostname(s string) bool {
- // The root domain name is valid. See golang.org/issue/45715.
- if s == "." {
- return true
- }
- // See RFC 1035, RFC 3696.
- // Presentation format has dots before every label except the first, and the
- // terminal empty label is optional here because we assume fully-qualified
- // (absolute) input. We must therefore reserve space for the first and last
- // labels' length octets in wire format, where they are necessary and the
- // maximum total length is 255.
- // So our _effective_ maximum is 253, but 254 is not rejected if the last
- // character is a dot.
- l := len(s)
- if l == 0 || l > 254 || l == 254 && s[l-1] != '.' {
- return false
- }
- last := byte('.')
- nonNumeric := false // true once we've seen a letter or hyphen
- partlen := 0
- for i := 0; i < len(s); i++ {
- c := s[i]
- switch {
- default:
- return false
- case 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || c == '_':
- nonNumeric = true
- partlen++
- case '0' <= c && c <= '9':
- // fine
- partlen++
- case c == '-':
- // Byte before dash cannot be dot.
- if last == '.' {
- return false
- }
- partlen++
- nonNumeric = true
- case c == '.':
- // Byte before dot cannot be dot, dash.
- if last == '.' || last == '-' {
- return false
- }
- if partlen > 63 || partlen == 0 {
- return false
- }
- partlen = 0
- }
- last = c
- }
- if last == '-' || partlen > 63 {
- return false
- }
- return nonNumeric
- }
- func IsValidHostnameOrIP(hostname string) bool {
- return isValidIP(hostname) || isValidHostname(hostname)
- }
|