infra
/
goutils
Archived
1
0
Fork 0
This repository has been archived on 2022-04-06. You can view files and clone it, but cannot push or open issues or pull requests.
goutils/net/ipv4_resolver.go

42 lines
984 B
Go

package net
import (
"context"
"github.com/benburkert/dns"
"net"
)
func ReplaceDefaultDnsResolver(){
cli := &dns.Client{Resolver: &PreferIPV4Resolver{}}
net.DefaultResolver.PreferGo = true
net.DefaultResolver.Dial = cli.Dial
}
type PreferIPV4Resolver struct{}
func (p *PreferIPV4Resolver) ServeDNS(ctx context.Context, w dns.MessageWriter, r *dns.Query) {
if r.Questions[0].Type == dns.TypeAAAA {
w.Status(dns.ServFail)
} else if msg, err := w.Recur(ctx); err != nil {
w.Status(dns.ServFail)
} else {
p.writeMessage(w, msg)
}
}
func (p *PreferIPV4Resolver) writeMessage(w dns.MessageWriter, msg *dns.Message) {
w.Status(msg.RCode)
w.Authoritative(msg.Authoritative)
w.Recursion(msg.RecursionAvailable)
for _, res := range msg.Answers {
w.Answer(res.Name, res.TTL, res.Record)
}
for _, res := range msg.Authorities {
w.Authority(res.Name, res.TTL, res.Record)
}
for _, res := range msg.Additionals {
w.Additional(res.Name, res.TTL, res.Record)
}
}