summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoyalsoldier <[email protected]>2024-08-13 11:30:39 +0800
committerLoyalsoldier <[email protected]>2024-08-13 11:31:05 +0800
commitd3d84fd33727fb323eec832adf6f5897997fd84e (patch)
treefb050cc6eda2a90862ad504e71927d8949e19fb9
parent50ed45ced0f436f1a2817390df46f85a953af675 (diff)
Feat: support remote URL in maxmindGeoLite2ASNCSV & maxmindGeoLite2CountryCSV
-rw-r--r--lib/common.go13
-rw-r--r--plugin/maxmind/asn_csv.go14
-rw-r--r--plugin/maxmind/country_csv.go28
3 files changed, 46 insertions, 9 deletions
diff --git a/lib/common.go b/lib/common.go
index a87285d5..51fd6b24 100644
--- a/lib/common.go
+++ b/lib/common.go
@@ -19,3 +19,16 @@ func GetRemoteURLContent(url string) ([]byte, error) {
return io.ReadAll(resp.Body)
}
+
+func GetRemoteURLReader(url string) (io.ReadCloser, error) {
+ resp, err := http.Get(url)
+ if err != nil {
+ return nil, err
+ }
+
+ if resp.StatusCode != http.StatusOK {
+ return nil, fmt.Errorf("failed to get remote content -> %s: %s", url, resp.Status)
+ }
+
+ return resp.Body, nil
+}
diff --git a/plugin/maxmind/asn_csv.go b/plugin/maxmind/asn_csv.go
index 73cd052b..e738a44b 100644
--- a/plugin/maxmind/asn_csv.go
+++ b/plugin/maxmind/asn_csv.go
@@ -163,13 +163,21 @@ func (g *geoLite2ASNCSV) process(file string, entries map[string]*lib.Entry) err
entries = make(map[string]*lib.Entry)
}
- fReader, err := os.Open(file)
+ var f io.ReadCloser
+ var err error
+ switch {
+ case strings.HasPrefix(strings.ToLower(file), "http://"), strings.HasPrefix(strings.ToLower(file), "https://"):
+ f, err = lib.GetRemoteURLReader(file)
+ default:
+ f, err = os.Open(file)
+ }
+
if err != nil {
return err
}
- defer fReader.Close()
+ defer f.Close()
- reader := csv.NewReader(fReader)
+ reader := csv.NewReader(f)
reader.Read() // skip header
for {
diff --git a/plugin/maxmind/country_csv.go b/plugin/maxmind/country_csv.go
index 4aa02975..090de13a 100644
--- a/plugin/maxmind/country_csv.go
+++ b/plugin/maxmind/country_csv.go
@@ -153,13 +153,21 @@ func (g *geoLite2CountryCSV) Input(container lib.Container) (lib.Container, erro
}
func (g *geoLite2CountryCSV) getCountryCode() (map[string]string, error) {
- ccReader, err := os.Open(g.CountryCodeFile)
+ var f io.ReadCloser
+ var err error
+ switch {
+ case strings.HasPrefix(strings.ToLower(g.CountryCodeFile), "http://"), strings.HasPrefix(strings.ToLower(g.CountryCodeFile), "https://"):
+ f, err = lib.GetRemoteURLReader(g.CountryCodeFile)
+ default:
+ f, err = os.Open(g.CountryCodeFile)
+ }
+
if err != nil {
return nil, err
}
- defer ccReader.Close()
+ defer f.Close()
- reader := csv.NewReader(ccReader)
+ reader := csv.NewReader(f)
lines, err := reader.ReadAll()
if err != nil {
return nil, err
@@ -199,13 +207,21 @@ func (g *geoLite2CountryCSV) process(file string, ccMap map[string]string, entri
entries = make(map[string]*lib.Entry, len(ccMap))
}
- fReader, err := os.Open(file)
+ var f io.ReadCloser
+ var err error
+ switch {
+ case strings.HasPrefix(strings.ToLower(file), "http://"), strings.HasPrefix(strings.ToLower(file), "https://"):
+ f, err = lib.GetRemoteURLReader(file)
+ default:
+ f, err = os.Open(file)
+ }
+
if err != nil {
return err
}
- defer fReader.Close()
+ defer f.Close()
- reader := csv.NewReader(fReader)
+ reader := csv.NewReader(f)
reader.Read() // skip header
for {