From ddfa9e8671dc21999668fb0c3532b3702a10e120 Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Sun, 22 Sep 2024 14:41:45 +0800 Subject: [PATCH] feat: add `etag-support` to let user can disable this feature manually --- component/resource/vehicle.go | 18 ++++++++++++++++-- config/config.go | 6 ++++++ hub/executor/executor.go | 2 ++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/component/resource/vehicle.go b/component/resource/vehicle.go index 200b950e0d..f30e22d0a7 100644 --- a/component/resource/vehicle.go +++ b/component/resource/vehicle.go @@ -21,6 +21,18 @@ const ( dirMode os.FileMode = 0o755 ) +var ( + etag = false +) + +func ETag() bool { + return etag +} + +func SetETag(b bool) { + etag = b +} + func safeWrite(path string, buf []byte) error { dir := filepath.Dir(path) @@ -103,7 +115,7 @@ func (h *HTTPVehicle) Read(ctx context.Context, oldHash types.HashType) (buf []b defer cancel() header := h.header setIfNoneMatch := false - if oldHash.IsValid() { + if etag && oldHash.IsValid() { hashBytes, etag := cachefile.Cache().GetETagWithHash(h.url) if oldHash.EqualBytes(hashBytes) && etag != "" { if header == nil { @@ -132,7 +144,9 @@ func (h *HTTPVehicle) Read(ctx context.Context, oldHash types.HashType) (buf []b return } hash = types.MakeHash(buf) - cachefile.Cache().SetETagWithHash(h.url, hash.Bytes(), resp.Header.Get("ETag")) + if etag { + cachefile.Cache().SetETagWithHash(h.url, hash.Bytes(), resp.Header.Get("ETag")) + } return } diff --git a/config/config.go b/config/config.go index 8fde168c39..75616edcc2 100644 --- a/config/config.go +++ b/config/config.go @@ -24,6 +24,7 @@ import ( mihomoHttp "github.com/metacubex/mihomo/component/http" P "github.com/metacubex/mihomo/component/process" "github.com/metacubex/mihomo/component/resolver" + "github.com/metacubex/mihomo/component/resource" "github.com/metacubex/mihomo/component/sniffer" tlsC "github.com/metacubex/mihomo/component/tls" "github.com/metacubex/mihomo/component/trie" @@ -65,6 +66,7 @@ type General struct { Sniffing bool `json:"sniffing"` GlobalClientFingerprint string `json:"global-client-fingerprint"` GlobalUA string `json:"global-ua"` + ETagSupport bool `json:"etag-support"` } // Inbound config @@ -381,6 +383,7 @@ type RawConfig struct { FindProcessMode P.FindProcessMode `yaml:"find-process-mode" json:"find-process-mode"` GlobalClientFingerprint string `yaml:"global-client-fingerprint" json:"global-client-fingerprint"` GlobalUA string `yaml:"global-ua" json:"global-ua"` + ETagSupport bool `yaml:"etag-support" json:"etag-support"` KeepAliveIdle int `yaml:"keep-alive-idle" json:"keep-alive-idle"` KeepAliveInterval int `yaml:"keep-alive-interval" json:"keep-alive-interval"` DisableKeepAlive bool `yaml:"disable-keep-alive" json:"disable-keep-alive"` @@ -444,6 +447,7 @@ func DefaultRawConfig() *RawConfig { TCPConcurrent: false, FindProcessMode: P.FindProcessStrict, GlobalUA: "clash.meta/" + C.Version, + ETagSupport: true, DNS: RawDNS{ Enable: false, IPv6: false, @@ -690,6 +694,7 @@ func parseGeneral(cfg *RawConfig) (*General, error) { geodata.SetMmdbUrl(cfg.GeoXUrl.Mmdb) geodata.SetASNUrl(cfg.GeoXUrl.ASN) mihomoHttp.SetUA(cfg.GlobalUA) + resource.SetETag(cfg.ETagSupport) if cfg.KeepAliveIdle != 0 { N.KeepAliveIdle = time.Duration(cfg.KeepAliveIdle) * time.Second @@ -755,6 +760,7 @@ func parseGeneral(cfg *RawConfig) (*General, error) { FindProcessMode: cfg.FindProcessMode, GlobalClientFingerprint: cfg.GlobalClientFingerprint, GlobalUA: cfg.GlobalUA, + ETagSupport: cfg.ETagSupport, }, nil } diff --git a/hub/executor/executor.go b/hub/executor/executor.go index 07b3b09097..66bbc89ba4 100644 --- a/hub/executor/executor.go +++ b/hub/executor/executor.go @@ -22,6 +22,7 @@ import ( "github.com/metacubex/mihomo/component/profile" "github.com/metacubex/mihomo/component/profile/cachefile" "github.com/metacubex/mihomo/component/resolver" + "github.com/metacubex/mihomo/component/resource" "github.com/metacubex/mihomo/component/sniffer" tlsC "github.com/metacubex/mihomo/component/tls" "github.com/metacubex/mihomo/component/trie" @@ -172,6 +173,7 @@ func GetGeneral() *config.General { Sniffing: tunnel.IsSniffing(), GlobalClientFingerprint: tlsC.GetGlobalFingerprint(), GlobalUA: mihomoHttp.UA(), + ETagSupport: resource.ETag(), } return general