mirror of
https://github.com/AdguardTeam/AdGuardHome.git
synced 2024-12-19 05:21:49 +03:00
44 lines
1 KiB
Go
44 lines
1 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
|
||
|
}
|