You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

48 lines
816 B

package internal
import (
"context"
"time"
"github.com/miekg/dns"
)
type DNSServer struct {
srv *dns.Server
dns.Handler
}
func (d *DNSServer) ListenAndServe(ctx context.Context, addr string) error {
errs := make(chan error)
c, canceller := context.WithCancel(ctx)
go d.runServer(c, "udp", addr, errs)
go d.runServer(c, "tcp", addr, errs)
defer canceller()
select {
case <-ctx.Done():
return nil
case err := <-errs:
return err
}
}
func (d *DNSServer) runServer(ctx context.Context, net, addr string, in chan<- error) {
d.srv = &dns.Server{
Addr: addr,
Net: net,
IdleTimeout: func() time.Duration { return time.Second * 5 },
Handler: d,
}
go func() {
<-ctx.Done()
d.srv.Listener.Close()
}()
if err := d.srv.ListenAndServe(); err != nil {
in <- err
}
}