From 1799ef47cedcfed8c979e145783fff7c9d1944cc Mon Sep 17 00:00:00 2001 From: radhitya Date: Sun, 5 Jul 2026 14:05:24 +0700 Subject: foreward upstream, in memory cache, udp listener, handler, cli flags --- internal/resolver/forward.go | 47 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 internal/resolver/forward.go (limited to 'internal/resolver/forward.go') diff --git a/internal/resolver/forward.go b/internal/resolver/forward.go new file mode 100644 index 0000000..68edc5d --- /dev/null +++ b/internal/resolver/forward.go @@ -0,0 +1,47 @@ +package resolver + +import ( + "fmt" + "net" + + "linum/internal/dns" +) + +type Forwarder struct { + upstream string +} + +func NewForwarder(upstream string) *Forwarder { + return &Forwarder{upstream: upstream} +} + +func (f *Forwarder) Resolve(query *dns.Msg) (*dns.Msg, error) { + query.Header.SetRD(true) + + wire, err := dns.Pack(query) + if err != nil { + return nil, fmt.Errorf("pack: %w", err) + } + + conn, err := net.Dial("udp", f.upstream) + if err != nil { + return nil, fmt.Errorf("dial %s: %w", f.upstream, err) + } + defer conn.Close() + + if _, err := conn.Write(wire); err != nil { + return nil, fmt.Errorf("write: %w", err) + } + + buf := make([]byte, 4096) + n, err := conn.Read(buf) + if err != nil { + return nil, fmt.Errorf("read: %w", err) + } + + resp, err := dns.Unpack(buf[:n]) + if err != nil { + return nil, fmt.Errorf("unpack response: $w", err) + } + return resp, nil +} -- cgit v1.2.3