Port changes from #2334
I'm not sure I follow, but I trust @lifenjoiner Fixes #2334
This commit is contained in:
parent
5085a22903
commit
2675d73b13
|
@ -631,7 +631,7 @@ func ConfigLoad(proxy *Proxy, flags *ConfigFlags) error {
|
||||||
proxy.anonDirectCertFallback = config.AnonymizedDNS.DirectCertFallback
|
proxy.anonDirectCertFallback = config.AnonymizedDNS.DirectCertFallback
|
||||||
|
|
||||||
if len(config.TLSKeyLogFile) > 0 {
|
if len(config.TLSKeyLogFile) > 0 {
|
||||||
f, err := os.OpenFile(config.TLSKeyLogFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600)
|
f, err := os.OpenFile(config.TLSKeyLogFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o600)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
dlog.Fatalf("Unable to create key log file [%s]: [%s]", config.TLSKeyLogFile, err)
|
dlog.Fatalf("Unable to create key log file [%s]: [%s]", config.TLSKeyLogFile, err)
|
||||||
}
|
}
|
||||||
|
@ -892,8 +892,8 @@ func (config *Config) loadSource(proxy *Proxy, cfgSourceName string, cfgSource *
|
||||||
if cfgSource.FormatStr == "" {
|
if cfgSource.FormatStr == "" {
|
||||||
cfgSource.FormatStr = "v2"
|
cfgSource.FormatStr = "v2"
|
||||||
}
|
}
|
||||||
if cfgSource.RefreshDelay <= 0 {
|
if cfgSource.RefreshDelay < 24 {
|
||||||
cfgSource.RefreshDelay = 72
|
cfgSource.RefreshDelay = 24
|
||||||
} else if cfgSource.RefreshDelay > 168 {
|
} else if cfgSource.RefreshDelay > 168 {
|
||||||
cfgSource.RefreshDelay = 168
|
cfgSource.RefreshDelay = 168
|
||||||
}
|
}
|
||||||
|
|
|
@ -696,9 +696,9 @@ format = 'tsv'
|
||||||
## If the `urls` property is missing, cache files and valid signatures
|
## If the `urls` property is missing, cache files and valid signatures
|
||||||
## must already be present. This doesn't prevent these cache files from
|
## must already be present. This doesn't prevent these cache files from
|
||||||
## expiring after `refresh_delay` hours.
|
## expiring after `refresh_delay` hours.
|
||||||
## Cache freshness is checked every 24 hours, so values for 'refresh_delay'
|
## `refreshed_delay` must be in the [24..168] interval.
|
||||||
## of less than 24 hours will have no effect.
|
## The minimum delay of 24 hours (1 day) avoids unnecessary requests to servers.
|
||||||
## A maximum delay of 168 hours (1 week) is imposed to ensure cache freshness.
|
## The maximum delay of 168 hours (1 week) ensures cache freshness.
|
||||||
|
|
||||||
[sources]
|
[sources]
|
||||||
|
|
||||||
|
|
|
@ -23,21 +23,18 @@ const (
|
||||||
SourceFormatV2 = iota
|
SourceFormatV2 = iota
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const MinimumPrefetchInterval time.Duration = 10 * time.Minute
|
||||||
DefaultPrefetchDelay time.Duration = 24 * time.Hour
|
|
||||||
MinimumPrefetchInterval time.Duration = 10 * time.Minute
|
|
||||||
)
|
|
||||||
|
|
||||||
type Source struct {
|
type Source struct {
|
||||||
name string
|
name string
|
||||||
urls []*url.URL
|
urls []*url.URL
|
||||||
bin []byte // copy of the file content - there's something wrong in our logic, we shouldn't need to keep that in memory
|
bin []byte // copy of the file content - there's something wrong in our logic, we shouldn't need to keep that in memory
|
||||||
minisignKey *minisign.PublicKey
|
minisignKey *minisign.PublicKey
|
||||||
cacheFile string
|
cacheFile string
|
||||||
prefix string
|
prefix string
|
||||||
cacheTTL, prefetchDelay time.Duration
|
cacheTTL time.Duration
|
||||||
refresh time.Time
|
refresh time.Time
|
||||||
format SourceFormat
|
format SourceFormat
|
||||||
}
|
}
|
||||||
|
|
||||||
func (source *Source) checkSignature(bin, sig []byte) (err error) {
|
func (source *Source) checkSignature(bin, sig []byte) (err error) {
|
||||||
|
@ -68,8 +65,8 @@ func (source *Source) fetchFromCache(now time.Time) (remaining time.Duration, er
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if elapsed := now.Sub(fi.ModTime()); elapsed < source.cacheTTL {
|
if elapsed := now.Sub(fi.ModTime()); elapsed < source.cacheTTL {
|
||||||
remaining = source.prefetchDelay - elapsed
|
remaining = source.cacheTTL - elapsed
|
||||||
dlog.Debugf("Source [%s] cache file [%s] is still fresh, next update: %v min", source.name, source.cacheFile, math.Round(remaining.Minutes()))
|
dlog.Debugf("Source [%s] cache file [%s] is still fresh, next update in %v min", source.name, source.cacheFile, math.Round(remaining.Minutes()))
|
||||||
} else {
|
} else {
|
||||||
dlog.Debugf("Source [%s] cache file [%s] needs to be refreshed", source.name, source.cacheFile)
|
dlog.Debugf("Source [%s] cache file [%s] needs to be refreshed", source.name, source.cacheFile)
|
||||||
}
|
}
|
||||||
|
@ -174,7 +171,7 @@ func (source *Source) fetchWithCache(xTransport *XTransport, now time.Time) (tim
|
||||||
return MinimumPrefetchInterval, err
|
return MinimumPrefetchInterval, err
|
||||||
}
|
}
|
||||||
source.updateCache(bin, sig, now)
|
source.updateCache(bin, sig, now)
|
||||||
remaining = source.prefetchDelay
|
remaining = source.cacheTTL
|
||||||
source.refresh = now.Add(remaining)
|
source.refresh = now.Add(remaining)
|
||||||
return remaining, nil
|
return remaining, nil
|
||||||
}
|
}
|
||||||
|
@ -190,16 +187,12 @@ func NewSource(
|
||||||
refreshDelay time.Duration,
|
refreshDelay time.Duration,
|
||||||
prefix string,
|
prefix string,
|
||||||
) (source *Source, err error) {
|
) (source *Source, err error) {
|
||||||
if refreshDelay < DefaultPrefetchDelay {
|
|
||||||
refreshDelay = DefaultPrefetchDelay
|
|
||||||
}
|
|
||||||
source = &Source{
|
source = &Source{
|
||||||
name: name,
|
name: name,
|
||||||
urls: []*url.URL{},
|
urls: []*url.URL{},
|
||||||
cacheFile: cacheFile,
|
cacheFile: cacheFile,
|
||||||
cacheTTL: refreshDelay,
|
cacheTTL: refreshDelay,
|
||||||
prefetchDelay: DefaultPrefetchDelay,
|
prefix: prefix,
|
||||||
prefix: prefix,
|
|
||||||
}
|
}
|
||||||
if formatStr == "v2" {
|
if formatStr == "v2" {
|
||||||
source.format = SourceFormatV2
|
source.format = SourceFormatV2
|
||||||
|
|
|
@ -42,6 +42,8 @@ const (
|
||||||
TestStatePathErr // unparseable path to files (download only)
|
TestStatePathErr // unparseable path to files (download only)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const DefaultPrefetchDelay time.Duration = 24 * time.Hour
|
||||||
|
|
||||||
type SourceTestData struct {
|
type SourceTestData struct {
|
||||||
n int // subtest counter
|
n int // subtest counter
|
||||||
xTransport *XTransport
|
xTransport *XTransport
|
||||||
|
@ -350,7 +352,7 @@ func prepSourceTestDownload(
|
||||||
}
|
}
|
||||||
if e.success {
|
if e.success {
|
||||||
e.err = ""
|
e.err = ""
|
||||||
e.delay = DefaultPrefetchDelay
|
e.delay = e.Source.cacheTTL
|
||||||
} else {
|
} else {
|
||||||
e.delay = MinimumPrefetchInterval
|
e.delay = MinimumPrefetchInterval
|
||||||
}
|
}
|
||||||
|
@ -371,7 +373,7 @@ func setupSourceTestCase(t *testing.T, d *SourceTestData, i int,
|
||||||
}
|
}
|
||||||
e.Source = &Source{
|
e.Source = &Source{
|
||||||
name: id, urls: []*url.URL{}, format: SourceFormatV2, minisignKey: d.key,
|
name: id, urls: []*url.URL{}, format: SourceFormatV2, minisignKey: d.key,
|
||||||
cacheFile: e.cachePath, cacheTTL: DefaultPrefetchDelay * 3, prefetchDelay: DefaultPrefetchDelay,
|
cacheFile: e.cachePath, cacheTTL: DefaultPrefetchDelay * 3,
|
||||||
}
|
}
|
||||||
if cacheTest != nil {
|
if cacheTest != nil {
|
||||||
prepSourceTestCache(t, d, e, d.sources[i], *cacheTest)
|
prepSourceTestCache(t, d, e, d.sources[i], *cacheTest)
|
||||||
|
@ -405,9 +407,9 @@ func TestNewSource(t *testing.T) {
|
||||||
refreshDelay time.Duration
|
refreshDelay time.Duration
|
||||||
e *SourceTestExpect
|
e *SourceTestExpect
|
||||||
}{
|
}{
|
||||||
{"", "", 0, &SourceTestExpect{err: " ", Source: &Source{name: "short refresh delay", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay, prefetchDelay: DefaultPrefetchDelay, prefix: ""}}},
|
{"", "", 0, &SourceTestExpect{err: " ", Source: &Source{name: "short refresh delay", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay, prefix: ""}}},
|
||||||
{"v1", d.keyStr, DefaultPrefetchDelay * 2, &SourceTestExpect{err: "Unsupported source format", Source: &Source{name: "old format", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay * 2, prefetchDelay: DefaultPrefetchDelay}}},
|
{"v1", d.keyStr, DefaultPrefetchDelay * 2, &SourceTestExpect{err: "Unsupported source format", Source: &Source{name: "old format", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay * 2}}},
|
||||||
{"v2", "", DefaultPrefetchDelay * 3, &SourceTestExpect{err: "Invalid encoded public key", Source: &Source{name: "invalid public key", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay * 3, prefetchDelay: DefaultPrefetchDelay}}},
|
{"v2", "", DefaultPrefetchDelay * 3, &SourceTestExpect{err: "Invalid encoded public key", Source: &Source{name: "invalid public key", urls: []*url.URL{}, cacheTTL: DefaultPrefetchDelay * 3}}},
|
||||||
} {
|
} {
|
||||||
t.Run(tt.e.Source.name, func(t *testing.T) {
|
t.Run(tt.e.Source.name, func(t *testing.T) {
|
||||||
got, err := NewSource(
|
got, err := NewSource(
|
||||||
|
@ -478,6 +480,7 @@ func TestPrefetchSources(t *testing.T) {
|
||||||
s := &Source{}
|
s := &Source{}
|
||||||
*s = *e.Source
|
*s = *e.Source
|
||||||
s.bin = nil
|
s.bin = nil
|
||||||
|
s.refresh = d.timeNow
|
||||||
sources = append(sources, s)
|
sources = append(sources, s)
|
||||||
expects = append(expects, e)
|
expects = append(expects, e)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue