all: sync with master
This commit is contained in:
@@ -18,6 +18,7 @@ import (
|
||||
"github.com/AdguardTeam/golibs/log"
|
||||
"github.com/AdguardTeam/golibs/netutil"
|
||||
"github.com/AdguardTeam/golibs/stringutil"
|
||||
"github.com/AdguardTeam/golibs/validate"
|
||||
)
|
||||
|
||||
// jsonDNSConfig is the JSON representation of the DNS server configuration.
|
||||
@@ -53,6 +54,9 @@ type jsonDNSConfig struct {
|
||||
// rate limiting requests.
|
||||
RatelimitSubnetLenIPv6 *int `json:"ratelimit_subnet_len_ipv6"`
|
||||
|
||||
// UpstreamTimeout is an upstream timeout in seconds.
|
||||
UpstreamTimeout *int `json:"upstream_timeout"`
|
||||
|
||||
// RatelimitWhitelist is a list of IP addresses excluded from rate limiting.
|
||||
RatelimitWhitelist *[]netip.Addr `json:"ratelimit_whitelist"`
|
||||
|
||||
@@ -147,6 +151,7 @@ func (s *Server) getDNSConfig() (c *jsonDNSConfig) {
|
||||
ratelimitSubnetLenIPv4 := s.conf.RatelimitSubnetLenIPv4
|
||||
ratelimitSubnetLenIPv6 := s.conf.RatelimitSubnetLenIPv6
|
||||
ratelimitWhitelist := append([]netip.Addr{}, s.conf.RatelimitWhitelist...)
|
||||
upstreamTimeout := int(s.conf.UpstreamTimeout.Seconds())
|
||||
|
||||
customIP := s.conf.EDNSClientSubnet.CustomIP
|
||||
enableEDNSClientSubnet := s.conf.EDNSClientSubnet.Enabled
|
||||
@@ -192,6 +197,7 @@ func (s *Server) getDNSConfig() (c *jsonDNSConfig) {
|
||||
RatelimitSubnetLenIPv4: &ratelimitSubnetLenIPv4,
|
||||
RatelimitSubnetLenIPv6: &ratelimitSubnetLenIPv6,
|
||||
RatelimitWhitelist: &ratelimitWhitelist,
|
||||
UpstreamTimeout: &upstreamTimeout,
|
||||
EDNSCSCustomIP: customIP,
|
||||
EDNSCSEnabled: &enableEDNSClientSubnet,
|
||||
EDNSCSUseCustom: &useCustom,
|
||||
@@ -302,6 +308,12 @@ func (req *jsonDNSConfig) validate(
|
||||
return err
|
||||
}
|
||||
|
||||
err = req.checkUpstreamTimeout()
|
||||
if err != nil {
|
||||
// Don't wrap the error since it's informative enough as is.
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -437,6 +449,16 @@ func (req *jsonDNSConfig) checkRatelimitSubnetMaskLen() (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
// checkUpstreamTimeout returns an error if the configuration of the upstream
|
||||
// timeout is invalid.
|
||||
func (req *jsonDNSConfig) checkUpstreamTimeout() (err error) {
|
||||
if req.UpstreamTimeout == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return validate.NoLessThan("upstream_timeout", *req.UpstreamTimeout, 1)
|
||||
}
|
||||
|
||||
// checkInclusion returns an error if a ptr is not nil and points to value,
|
||||
// that not in the inclusive range between minN and maxN.
|
||||
func checkInclusion(ptr *int, minN, maxN int) (err error) {
|
||||
@@ -588,6 +610,14 @@ func (s *Server) setConfigRestartable(dc *jsonDNSConfig) (shouldRestart bool) {
|
||||
shouldRestart = true
|
||||
}
|
||||
|
||||
if dc.UpstreamTimeout != nil {
|
||||
ut := time.Duration(*dc.UpstreamTimeout) * time.Second
|
||||
if s.conf.UpstreamTimeout != ut {
|
||||
s.conf.UpstreamTimeout = ut
|
||||
shouldRestart = true
|
||||
}
|
||||
}
|
||||
|
||||
return shouldRestart
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user