44 lines
1.0 KiB
Go
44 lines
1.0 KiB
Go
package aghnet
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/AdguardTeam/golibs/stringutil"
|
|
)
|
|
|
|
// NormalizeDomain returns a lowercased version of host without the final dot,
|
|
// unless host is ".", in which case it returns it unchanged. That is a special
|
|
// case that to allow matching queries like:
|
|
//
|
|
// dig IN NS '.'
|
|
func NormalizeDomain(host string) (norm string) {
|
|
if host == "." {
|
|
return host
|
|
}
|
|
|
|
return strings.ToLower(strings.TrimSuffix(host, "."))
|
|
}
|
|
|
|
// NewDomainNameSet returns nil and error, if list has duplicate or empty domain
|
|
// name. Otherwise returns a set, which contains domain names normalized using
|
|
// [NormalizeDomain].
|
|
func NewDomainNameSet(list []string) (set *stringutil.Set, err error) {
|
|
set = stringutil.NewSet()
|
|
|
|
for i, host := range list {
|
|
if host == "" {
|
|
return nil, fmt.Errorf("at index %d: hostname is empty", i)
|
|
}
|
|
|
|
host = NormalizeDomain(host)
|
|
if set.Has(host) {
|
|
return nil, fmt.Errorf("duplicate hostname %q at index %d", host, i)
|
|
}
|
|
|
|
set.Add(host)
|
|
}
|
|
|
|
return set, nil
|
|
}
|