public_suffix.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package tf
  2. import (
  3. "bufio"
  4. "bytes"
  5. _ "embed"
  6. "io"
  7. "strings"
  8. "github.com/sagernet/sing/common"
  9. "github.com/sagernet/sing/common/domain"
  10. E "github.com/sagernet/sing/common/exceptions"
  11. F "github.com/sagernet/sing/common/format"
  12. )
  13. var publicPrefix = []string{
  14. "www",
  15. }
  16. //go:generate wget -O public_suffix_list.dat https://publicsuffix.org/list/public_suffix_list.dat
  17. //go:embed public_suffix_list.dat
  18. var publicSuffix []byte
  19. var publicSuffixMatcher = common.OnceValue(func() *domain.Matcher {
  20. matcher, err := initPublicSuffixMatcher()
  21. if err != nil {
  22. panic(F.ToString("error in initialize public suffix matcher"))
  23. }
  24. return matcher
  25. })
  26. func initPublicSuffixMatcher() (*domain.Matcher, error) {
  27. reader := bufio.NewReader(bytes.NewReader(publicSuffix))
  28. var domainList []string
  29. for {
  30. line, isPrefix, err := reader.ReadLine()
  31. if err != nil {
  32. if err == io.EOF {
  33. break
  34. }
  35. return nil, err
  36. }
  37. if isPrefix {
  38. return nil, E.New("unexpected prefix line")
  39. }
  40. lineStr := string(line)
  41. lineStr = strings.TrimSpace(lineStr)
  42. if lineStr == "" || strings.HasPrefix(lineStr, "//") {
  43. continue
  44. }
  45. domainList = append(domainList, lineStr)
  46. }
  47. return domain.NewMatcher(domainList, nil, false), nil
  48. }