summaryrefslogtreecommitdiff
path: root/internal/server/handler.go
diff options
context:
space:
mode:
authorradhitya <alif@radhitya.org>2026-06-13 16:09:53 +0700
committerradhitya <alif@radhitya.org>2026-06-13 16:09:53 +0700
commit3e44adc94f32bfe500730fcbf1c02cedf65b0a30 (patch)
tree66932e0f386ba1277506e9d1fb18eaaad70bfef3 /internal/server/handler.go
parentd802d4a685016be8b79c89b4f21099b9a1569532 (diff)
root hints, glue record, delegation loop, iterative, ns fallback, timeout, glue record
Diffstat (limited to 'internal/server/handler.go')
-rw-r--r--internal/server/handler.go37
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
}