summaryrefslogtreecommitdiff
path: root/internal/server/handler.go
diff options
context:
space:
mode:
authorradhitya <alif@radhitya.org>2026-06-23 05:36:25 +0700
committerradhitya <alif@radhitya.org>2026-06-23 05:36:25 +0700
commit2c61900dd5efd81a5351513a20fa65580c8a6616 (patch)
tree61bdd1abb0d4fead3d04197404f731f831b1b548 /internal/server/handler.go
parent786e88a56f1445b31f194920d832dd037bd2a2d1 (diff)
make if error for unsupported query type
Diffstat (limited to 'internal/server/handler.go')
-rw-r--r--internal/server/handler.go32
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