diff options
Diffstat (limited to 'internal/server/handler.go')
| -rw-r--r-- | internal/server/handler.go | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/internal/server/handler.go b/internal/server/handler.go index 2e2f08b..bac1c81 100644 --- a/internal/server/handler.go +++ b/internal/server/handler.go @@ -1,11 +1,13 @@ package server import ( + "context" "github.com/miekg/dns" "log/slog" + "time" ) -func handleQuery(w dns.ResponseWriter, req *dns.Msg) { +func (s *Server) handleQuery(w dns.ResponseWriter, req *dns.Msg) { if len(req.Question) == 0 { m := new(dns.Msg) m.SetRcode(req, dns.RcodeFormatError) @@ -13,7 +15,7 @@ func handleQuery(w dns.ResponseWriter, req *dns.Msg) { return } - resp := buildResponse(req) + resp := s.buildResponse(req) if err := w.WriteMsg(resp); err != nil { slog.Error("write response failed", @@ -31,7 +33,7 @@ func handleQuery(w dns.ResponseWriter, req *dns.Msg) { ) } -func buildResponse(req *dns.Msg) *dns.Msg { +func (s *Server) buildResponse(req *dns.Msg) *dns.Msg { if len(req.Question) == 0 { m := new(dns.Msg) m.SetRcode(req, dns.RcodeFormatError) @@ -46,20 +48,19 @@ func buildResponse(req *dns.Msg) *dns.Msg { resp.SetEdns0(4096, false) } - if q.Name == "example.com." && q.Qtype == dns.TypeA { - resp.Answer = []dns.RR{ - &dns.A{ - Hdr: dns.RR_Header{ - Name: q.Name, - Rrtype: dns.TypeA, - Class: dns.ClassINET, - Ttl: 60, - }, - A: []byte{127, 0, 0, 1}, - }, - } - } else { - resp.Rcode = dns.RcodeNameError + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + reply, err := s.resolver.Lookup(ctx, q.Name, q.Qtype) + if err != nil { + slog.Error("resolution failed", + "err", err, + "qname", q.Name, + "qtype", dns.TypeToString[q.Qtype], + ) + resp.Rcode = dns.RcodeServerFailure + return resp } - return resp + + return reply } |
