aboutsummaryrefslogtreecommitdiff
path: root/core/dnsserver/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'core/dnsserver/server.go')
-rw-r--r--core/dnsserver/server.go40
1 files changed, 35 insertions, 5 deletions
diff --git a/core/dnsserver/server.go b/core/dnsserver/server.go
index 478287bf8..2107e8d01 100644
--- a/core/dnsserver/server.go
+++ b/core/dnsserver/server.go
@@ -44,6 +44,9 @@ type Server struct {
debug bool // disable recover()
stacktrace bool // enable stacktrace in recover error log
classChaos bool // allow non-INET class queries
+ idleTimeout time.Duration // Idle timeout for TCP
+ readTimeout time.Duration // Read timeout for TCP
+ writeTimeout time.Duration // Write timeout for TCP
tsigSecret map[string]string
}
@@ -60,6 +63,9 @@ func NewServer(addr string, group []*Config) (*Server, error) {
Addr: addr,
zones: make(map[string][]*Config),
graceTimeout: 5 * time.Second,
+ idleTimeout: 10 * time.Second,
+ readTimeout: 3 * time.Second,
+ writeTimeout: 5 * time.Second,
tsigSecret: make(map[string]string),
}
@@ -81,6 +87,17 @@ func NewServer(addr string, group []*Config) (*Server, error) {
// append the config to the zone's configs
s.zones[site.Zone] = append(s.zones[site.Zone], site)
+ // set timeouts
+ if site.ReadTimeout != 0 {
+ s.readTimeout = site.ReadTimeout
+ }
+ if site.WriteTimeout != 0 {
+ s.writeTimeout = site.WriteTimeout
+ }
+ if site.IdleTimeout != 0 {
+ s.idleTimeout = site.IdleTimeout
+ }
+
// copy tsig secrets
for key, secret := range site.TsigSecret {
s.tsigSecret[key] = secret
@@ -130,11 +147,22 @@ var _ caddy.GracefulServer = &Server{}
// This implements caddy.TCPServer interface.
func (s *Server) Serve(l net.Listener) error {
s.m.Lock()
- s.server[tcp] = &dns.Server{Listener: l, Net: "tcp", Handler: dns.HandlerFunc(func(w dns.ResponseWriter, r *dns.Msg) {
- ctx := context.WithValue(context.Background(), Key{}, s)
- ctx = context.WithValue(ctx, LoopKey{}, 0)
- s.ServeDNS(ctx, w, r)
- }), TsigSecret: s.tsigSecret}
+
+ s.server[tcp] = &dns.Server{Listener: l,
+ Net: "tcp",
+ TsigSecret: s.tsigSecret,
+ MaxTCPQueries: tcpMaxQueries,
+ ReadTimeout: s.readTimeout,
+ WriteTimeout: s.writeTimeout,
+ IdleTimeout: func() time.Duration {
+ return s.idleTimeout
+ },
+ Handler: dns.HandlerFunc(func(w dns.ResponseWriter, r *dns.Msg) {
+ ctx := context.WithValue(context.Background(), Key{}, s)
+ ctx = context.WithValue(ctx, LoopKey{}, 0)
+ s.ServeDNS(ctx, w, r)
+ })}
+
s.m.Unlock()
return s.server[tcp].ActivateAndServe()
@@ -404,6 +432,8 @@ func errorAndMetricsFunc(server string, w dns.ResponseWriter, r *dns.Msg, rc int
const (
tcp = 0
udp = 1
+
+ tcpMaxQueries = -1
)
type (