reader.go 823 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. package geoip
  2. import (
  3. "net/netip"
  4. E "github.com/sagernet/sing/common/exceptions"
  5. N "github.com/sagernet/sing/common/network"
  6. "github.com/oschwald/maxminddb-golang"
  7. )
  8. type Reader struct {
  9. reader *maxminddb.Reader
  10. }
  11. func Open(path string) (*Reader, []string, error) {
  12. database, err := maxminddb.Open(path)
  13. if err != nil {
  14. return nil, nil, err
  15. }
  16. if database.Metadata.DatabaseType != "sing-geoip" {
  17. database.Close()
  18. return nil, nil, E.New("incorrect database type, expected sing-geoip, got ", database.Metadata.DatabaseType)
  19. }
  20. return &Reader{database}, database.Metadata.Languages, nil
  21. }
  22. func (r *Reader) Lookup(addr netip.Addr) string {
  23. var code string
  24. _ = r.reader.Lookup(addr.AsSlice(), &code)
  25. if code != "" {
  26. return code
  27. }
  28. if !N.IsPublicAddr(addr) {
  29. return "private"
  30. }
  31. return "unknown"
  32. }