123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- package geodb
- import (
- _ "embed"
- "net/http"
- "imuslab.com/zoraxy/mod/database"
- "imuslab.com/zoraxy/mod/netutils"
- )
- //go:embed geoipv4.csv
- var geoipv4 []byte //Geodb dataset for ipv4
- //go:embed geoipv6.csv
- var geoipv6 []byte //Geodb dataset for ipv6
- type Store struct {
- geodb [][]string //Parsed geodb list
- geodbIpv6 [][]string //Parsed geodb list for ipv6
- geotrie *trie
- geotrieIpv6 *trie
- sysdb *database.Database
- option *StoreOptions
- }
- type StoreOptions struct {
- AllowSlowIpv4LookUp bool
- AllowSloeIpv6Lookup bool
- }
- type CountryInfo struct {
- CountryIsoCode string
- ContinetCode string
- }
- func NewGeoDb(sysdb *database.Database, option *StoreOptions) (*Store, error) {
- parsedGeoData, err := parseCSV(geoipv4)
- if err != nil {
- return nil, err
- }
- parsedGeoDataIpv6, err := parseCSV(geoipv6)
- if err != nil {
- return nil, err
- }
- var ipv4Trie *trie
- if !option.AllowSlowIpv4LookUp {
- ipv4Trie = constrctTrieTree(parsedGeoData)
- }
- var ipv6Trie *trie
- if !option.AllowSloeIpv6Lookup {
- ipv6Trie = constrctTrieTree(parsedGeoDataIpv6)
- }
- return &Store{
- geodb: parsedGeoData,
- geotrie: ipv4Trie,
- geodbIpv6: parsedGeoDataIpv6,
- geotrieIpv6: ipv6Trie,
- sysdb: sysdb,
- option: option,
- }, nil
- }
- func (s *Store) ResolveCountryCodeFromIP(ipstring string) (*CountryInfo, error) {
- cc := s.search(ipstring)
- return &CountryInfo{
- CountryIsoCode: cc,
- ContinetCode: "",
- }, nil
- }
- func (s *Store) Close() {
- }
- func (s *Store) GetRequesterCountryISOCode(r *http.Request) string {
- ipAddr := netutils.GetRequesterIP(r)
- if ipAddr == "" {
- return ""
- }
- if netutils.IsPrivateIP(ipAddr) {
- return "LAN"
- }
- countryCode, err := s.ResolveCountryCodeFromIP(ipAddr)
- if err != nil {
- return ""
- }
- return countryCode.CountryIsoCode
- }
|