package tf import ( "bufio" "bytes" _ "embed" "io" "strings" "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/domain" E "github.com/sagernet/sing/common/exceptions" F "github.com/sagernet/sing/common/format" ) var publicPrefix = []string{ "www", } //go:generate wget -O public_suffix_list.dat https://publicsuffix.org/list/public_suffix_list.dat //go:embed public_suffix_list.dat var publicSuffix []byte var publicSuffixMatcher = common.OnceValue(func() *domain.Matcher { matcher, err := initPublicSuffixMatcher() if err != nil { panic(F.ToString("error in initialize public suffix matcher")) } return matcher }) func initPublicSuffixMatcher() (*domain.Matcher, error) { reader := bufio.NewReader(bytes.NewReader(publicSuffix)) var domainList []string for { line, isPrefix, err := reader.ReadLine() if err != nil { if err == io.EOF { break } return nil, err } if isPrefix { return nil, E.New("unexpected prefix line") } lineStr := string(line) lineStr = strings.TrimSpace(lineStr) if lineStr == "" || strings.HasPrefix(lineStr, "//") { continue } domainList = append(domainList, lineStr) } return domain.NewMatcher(domainList, nil, false), nil }