summaryrefslogtreecommitdiff
path: root/internal/server/handler.go
diff options
context:
space:
mode:
authorradhitya <alif@radhitya.org>2026-06-13 12:46:38 +0700
committerradhitya <alif@radhitya.org>2026-06-13 12:46:38 +0700
commit01e05e8df5f56d605dfd75456a424527e76a2955 (patch)
tree3de06990292982a7c13f9a6edc9fe07e6127ff00 /internal/server/handler.go
parent1d1a15075b93815a2d006167d433c03d1abef419 (diff)
dns codec, udp server (reuseport, 4096 buffers), tcp server, doh listener post get without tls, concurrent, ends0, fuzz)
Diffstat (limited to 'internal/server/handler.go')
-rw-r--r--internal/server/handler.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/internal/server/handler.go b/internal/server/handler.go
new file mode 100644
index 0000000..2e2f08b
--- /dev/null
+++ b/internal/server/handler.go
@@ -0,0 +1,65 @@
+package server
+
+import (
+ "github.com/miekg/dns"
+ "log/slog"
+)
+
+func handleQuery(w dns.ResponseWriter, req *dns.Msg) {
+ if len(req.Question) == 0 {
+ m := new(dns.Msg)
+ m.SetRcode(req, dns.RcodeFormatError)
+ _ = w.WriteMsg(m)
+ return
+ }
+
+ resp := buildResponse(req)
+
+ if err := w.WriteMsg(resp); err != nil {
+ slog.Error("write response failed",
+ "err", err,
+ "qname", req.Question[0].Name,
+ "qtype", dns.TypeToString[req.Question[0].Qtype],
+ )
+ return
+ }
+ slog.Info("query served",
+ "qname", req.Question[0].Name,
+ "qtype", dns.TypeToString[req.Question[0].Qtype],
+ "rcode", dns.RcodeToString[resp.Rcode],
+ "client", w.RemoteAddr().String(),
+ )
+}
+
+func buildResponse(req *dns.Msg) *dns.Msg {
+ if len(req.Question) == 0 {
+ m := new(dns.Msg)
+ m.SetRcode(req, dns.RcodeFormatError)
+ return m
+ }
+ q := req.Question[0]
+ resp := new(dns.Msg)
+ resp.SetReply(req)
+ resp.Authoritative = false
+
+ if opt := req.IsEdns0(); opt != nil {
+ 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
+ }
+ return resp
+}