mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2025-11-03 23:20:26 +08:00
79 lines
1.3 KiB
Go
79 lines
1.3 KiB
Go
package iplibrary
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
|
"github.com/TeaOSLab/EdgeAPI/internal/remotelogs"
|
|
"github.com/lionsoul2014/ip2region/binding/golang/ip2region"
|
|
"strings"
|
|
)
|
|
|
|
type IP2RegionLibrary struct {
|
|
db *ip2region.Ip2Region
|
|
}
|
|
|
|
func (this *IP2RegionLibrary) Load(dbPath string) error {
|
|
db, err := ip2region.New(dbPath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
this.db = db
|
|
|
|
return nil
|
|
}
|
|
|
|
func (this *IP2RegionLibrary) Lookup(ip string) (*Result, error) {
|
|
if this.db == nil {
|
|
return nil, errors.New("library has not been loaded")
|
|
}
|
|
|
|
// 暂不支持IPv6
|
|
if strings.Contains(ip, ":") {
|
|
return nil, nil
|
|
}
|
|
|
|
defer func() {
|
|
// 防止panic发生
|
|
err := recover()
|
|
if err != nil {
|
|
remotelogs.Error("IP2RegionLibrary", "panic: "+fmt.Sprintf("%#v", err))
|
|
}
|
|
}()
|
|
|
|
info, err := this.db.MemorySearch(ip)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if info.Country == "0" {
|
|
info.Country = ""
|
|
}
|
|
if info.Region == "0" {
|
|
info.Region = ""
|
|
}
|
|
if info.Province == "0" {
|
|
info.Province = ""
|
|
}
|
|
if info.City == "0" {
|
|
info.City = ""
|
|
}
|
|
if info.ISP == "0" {
|
|
info.ISP = ""
|
|
}
|
|
|
|
return &Result{
|
|
CityId: info.CityId,
|
|
Country: info.Country,
|
|
Region: info.Region,
|
|
Province: info.Province,
|
|
City: info.City,
|
|
ISP: info.ISP,
|
|
}, nil
|
|
}
|
|
|
|
func (this *IP2RegionLibrary) Close() {
|
|
if this.db != nil {
|
|
this.db.Close()
|
|
}
|
|
}
|