diff --git a/next/assets/assets.go b/next/assets/assets.go index 21a8f5f..e0e8252 100644 --- a/next/assets/assets.go +++ b/next/assets/assets.go @@ -3,9 +3,11 @@ package assets import "XProxy/next/logger" func Demo() { - raw, _ := download("https://cdn.dnomd343.top/v2ray-rules-dat/geosite.dat", "") - //raw, _ := download("https://cdn.dnomd343.top/v2ray-rules-dat/geosite.dat", "socks5://192.168.2.2:1084") - //raw, _ := download("https://cdn.dnomd343.top/v2ray-rules-dat/geosite.dat.xz", "") + //raw, t, _ := download("https://github.com/Loyalsoldier/v2ray-rules-dat/releases/download/202309082208/geosite.dat", "") + //raw, t, _ := download("https://cdn.dnomd343.top/v2ray-rules-dat/geosite.dat", "") + //raw, t, _ := download("https://cdn.dnomd343.top/v2ray-rules-dat/geosite.dat", "socks5://192.168.2.2:1084") + raw, t, _ := download("https://cdn.dnomd343.top/v2ray-rules-dat/geosite.dat.xz", "") + logger.Infof("%v", t) ret, _ := tryExtract(raw) logger.Debugf("content size -> %d", len(ret)) } diff --git a/next/assets/remote.go b/next/assets/remote.go index 09fdee1..0205021 100644 --- a/next/assets/remote.go +++ b/next/assets/remote.go @@ -10,6 +10,7 @@ import ( "io" "net/http" "net/url" + "time" ) // broltiDecode handles brolti encoding in http responses. @@ -81,23 +82,36 @@ func createClient(remoteUrl string, proxyUrl string) (http.Client, error) { }, nil } -// download obtains resource file from the remote server and supports proxy. -func download(url string, proxy string) ([]byte, error) { +// assetDate attempts to obtain the last modification time of the remote +// file and returns nil if it does not exist or is invalid. +func assetDate(resp *http.Response) *time.Time { + date, err := http.ParseTime(resp.Header.Get(headers.LastModified)) + if err != nil { + logger.Warnf("Unable to get remote data modification time") + return nil + } + logger.Debugf("Remote data modification time -> `%v`", date) + return &date +} + +// download obtains resource file from the remote server, gets its +// modification time, and supports proxy acquisition. +func download(url string, proxy string) ([]byte, *time.Time, error) { client, err := createClient(url, proxy) if err != nil { - return nil, err + return nil, nil, err } req, err := http.NewRequest("GET", url, nil) if err != nil { logger.Errorf("Failed to create http request -> %v", err) - return nil, err + return nil, nil, err } req.Header.Set(headers.AcceptEncoding, "gzip, deflate, br") resp, err := client.Do(req) if err != nil { logger.Errorf("Failed to execute http request -> %v", err) - return nil, err + return nil, nil, err } defer resp.Body.Close() logger.Debugf("Remote data downloaded successfully") @@ -117,8 +131,8 @@ func download(url string, proxy string) ([]byte, error) { content, err = nonDecode(resp.Body) } if err != nil { - return nil, err + return nil, nil, err } logger.Debugf("Download `%s` successfully -> %d bytes", url, len(content)) - return content, nil + return content, assetDate(resp), nil }