63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
package dnstrie
|
|
|
|
import (
|
|
"strings"
|
|
"unicode"
|
|
)
|
|
|
|
// isValidDomainName validates if the given string is a valid DNS hostname.
|
|
// A valid hostname consists of a series of labels separated by dots.
|
|
// Each label must:
|
|
// - Be between 1 and 63 characters long.
|
|
// - Consist only of ASCII letters ('a'-'z', 'A'-'Z'), digits ('0'-'9'), and hyphens ('-').
|
|
// - Not start or end with a hyphen.
|
|
// The total length of the hostname (including dots) must not exceed 253 characters.
|
|
func isValidDomainName(host string) bool {
|
|
// 1. Check total length. The maximum length of a full hostname is 253 characters.
|
|
if len(host) > 253 {
|
|
return false
|
|
}
|
|
|
|
// An empty string is not a valid hostname.
|
|
if host == "" {
|
|
return false
|
|
}
|
|
|
|
// 2. Handle optional trailing dot for FQDNs.
|
|
// If the hostname ends with a dot, we remove it for validation purposes.
|
|
if strings.HasSuffix(host, ".") {
|
|
host = host[:len(host)-1]
|
|
}
|
|
|
|
// After removing a potential trailing dot, the string might be empty.
|
|
if host == "" {
|
|
return false
|
|
}
|
|
|
|
// 3. Split the hostname into labels.
|
|
labels := strings.Split(host, ".")
|
|
|
|
// 4. Validate each label.
|
|
for _, label := range labels {
|
|
// a. Check label length (1 to 63 characters).
|
|
if len(label) < 1 || len(label) > 63 {
|
|
return false
|
|
}
|
|
|
|
// b. Check if label starts or ends with a hyphen.
|
|
if strings.HasPrefix(label, "-") || strings.HasSuffix(label, "-") {
|
|
return false
|
|
}
|
|
|
|
// c. Check for allowed characters in the label.
|
|
for _, char := range label {
|
|
if !unicode.IsLetter(char) && !unicode.IsDigit(char) && char != '-' {
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
|
|
// If all checks pass, the hostname is valid.
|
|
return true
|
|
}
|