chore: parse options correctly

This commit is contained in:
Karan Sharma 2020-12-12 12:16:54 +05:30
parent 169837d094
commit 8bcd940685
8 changed files with 70 additions and 39 deletions

View file

@ -13,11 +13,18 @@ type ClassicResolver struct {
servers []string
}
// ClassicResolverOpts holds options for setting up a Classic resolver.
type ClassicResolverOpts struct {
UseIPv4 bool
UseIPv6 bool
UseTCP bool
}
//DefaultResolvConfPath specifies path to default resolv config file on UNIX.
const DefaultResolvConfPath = "/etc/resolv.conf"
// NewClassicResolver accepts a list of nameservers and configures a DNS resolver.
func NewClassicResolver(servers []string) (Resolver, error) {
func NewClassicResolver(servers []string, opts ClassicResolverOpts) (Resolver, error) {
client := &dns.Client{}
var nameservers []string
for _, srv := range servers {
@ -31,6 +38,13 @@ func NewClassicResolver(servers []string) (Resolver, error) {
nameservers = append(nameservers, fmt.Sprintf("%s:%s", host, port))
}
}
client.Net = "udp"
if opts.UseIPv4 {
client.Net = "udp4"
}
if opts.UseIPv6 {
client.Net = "udp6"
}
return &ClassicResolver{
client: client,
servers: nameservers,
@ -70,15 +84,8 @@ func NewResolverFromResolvFile(resolvFilePath string) (Resolver, error) {
// It's possible to send multiple question in one message
// but some nameservers are not able to
func (c *ClassicResolver) Lookup(questions []dns.Question) error {
var messages = make([]dns.Msg, 0, len(questions))
for _, q := range questions {
msg := dns.Msg{}
msg.Id = dns.Id()
msg.RecursionDesired = true
// It's recommended to only send 1 question for 1 DNS message.
msg.Question = []dns.Question{q}
messages = append(messages, msg)
}
messages := prepareMessages(questions)
for _, msg := range messages {
for _, srv := range c.servers {
in, rtt, err := c.client.Exchange(&msg, srv)

View file

@ -28,15 +28,8 @@ func NewDOHResolver(servers []string) (Resolver, error) {
}
func (r *DOHResolver) Lookup(questions []dns.Question) error {
var messages = make([]dns.Msg, 0, len(questions))
for _, q := range questions {
msg := dns.Msg{}
msg.Id = dns.Id()
msg.RecursionDesired = true
// It's recommended to only send 1 question for 1 DNS message.
msg.Question = []dns.Question{q}
messages = append(messages, msg)
}
messages := prepareMessages(questions)
for _, m := range messages {
b, err := m.Pack()
if err != nil {

18
pkg/resolvers/utils.go Normal file
View file

@ -0,0 +1,18 @@
package resolvers
import "github.com/miekg/dns"
// prepareMessages takes a slice fo `dns.Question`
// and initialises `dns.Messages` for each question
func prepareMessages(questions []dns.Question) []dns.Msg {
var messages = make([]dns.Msg, 0, len(questions))
for _, q := range questions {
msg := dns.Msg{}
msg.Id = dns.Id()
msg.RecursionDesired = true
// It's recommended to only send 1 question for 1 DNS message.
msg.Question = []dns.Question{q}
messages = append(messages, msg)
}
return messages
}