diff options
| author | radhitya <alif@radhitya.org> | 2026-06-23 05:36:25 +0700 |
|---|---|---|
| committer | radhitya <alif@radhitya.org> | 2026-06-23 05:36:25 +0700 |
| commit | 2c61900dd5efd81a5351513a20fa65580c8a6616 (patch) | |
| tree | 61bdd1abb0d4fead3d04197404f731f831b1b548 /internal/server/handler.go | |
| parent | 786e88a56f1445b31f194920d832dd037bd2a2d1 (diff) | |
make if error for unsupported query type
Diffstat (limited to 'internal/server/handler.go')
| -rw-r--r-- | internal/server/handler.go | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/internal/server/handler.go b/internal/server/handler.go index 4516468..46699d6 100644 --- a/internal/server/handler.go +++ b/internal/server/handler.go @@ -1,20 +1,36 @@ package server import ( + "codeberg.org/miekg/dns" + "codeberg.org/miekg/dns/rdata" "context" + "errors" "io" + "linum/internal/blocklist" + "linum/internal/cache" + "linum/internal/resolver" "log/slog" "net" "net/netip" + "runtime/debug" "time" - - "codeberg.org/miekg/dns" - "codeberg.org/miekg/dns/rdata" - "linum/internal/blocklist" - "linum/internal/cache" ) func (s *Server) handleQuery(ctx context.Context, w dns.ResponseWriter, req *dns.Msg) { + defer func() { + if r := recover(); r != nil { + slog.Error("panic in query handler", "recover", r, "stack", string(debug.Stack())) + m := new(dns.Msg) + m.Response = true + m.Rcode = dns.RcodeServerFailure + if req != nil { + m.ID = req.ID + m.Question = req.Question + } + io.Copy(w, m) + } + }() + clientIP := parseClientIP(w.RemoteAddr()) if !s.isAllowed(clientIP) { slog.Warn("query denied by ACL", "client", clientIP) @@ -92,13 +108,17 @@ func (s *Server) buildResponse(req *dns.Msg) (*dns.Msg, bool) { reply, err := s.resolver.Lookup(ctx, qname, qtype) if err != nil { + rcode := dns.RcodeServerFailure + if errors.Is(err, resolver.ErrUnsupportedType) { + rcode = dns.RcodeNotImplemented + } slog.Error("resolution failed", "err", err, "qname", qname, "qtype", dns.TypeToString[qtype], ) m := new(dns.Msg) - m.Rcode = dns.RcodeServerFailure + m.Rcode = uint16(rcode) m.Response = true m.ID = req.ID m.Question = req.Question |
