-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsingle.go
73 lines (62 loc) · 1.74 KB
/
single.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package resolver
import (
"context"
"darvaza.org/resolver/pkg/client"
"darvaza.org/resolver/pkg/errors"
"darvaza.org/resolver/pkg/exdns"
"github.com/miekg/dns"
)
var (
_ Lookuper = (*SingleLookuper)(nil)
_ Exchanger = (*SingleLookuper)(nil)
)
// SingleLookuper asks a single server for a direct answer
// to the query preventing repetition
type SingleLookuper struct {
c client.Client
remote string
recursive bool
}
// Lookup asks the designed remote to make a DNS Lookup
func (r SingleLookuper) Lookup(ctx context.Context,
qName string, qType uint16) (*dns.Msg, error) {
//
m := exdns.NewRequestFromParts(dns.Fqdn(qName), dns.ClassINET, qType)
m.RecursionDesired = r.recursive
return r.Exchange(ctx, m)
}
// Exchange exchanges a message with a designed server
func (r SingleLookuper) Exchange(ctx context.Context,
msg *dns.Msg) (*dns.Msg, error) {
//
res, _, err := r.c.ExchangeContext(ctx, msg, r.remote)
if werr := errors.ValidateResponse(r.remote, res, err); werr != nil {
return nil, werr
}
return res, nil
}
// NewSingleLookuper creates a Lookuper that asks one particular
// server
func NewSingleLookuper(server string, recursive bool) (*SingleLookuper, error) {
return NewSingleLookuperWithClient(server, recursive, nil)
}
// NewSingleLookuperWithClient creates a lookuper that asks one particular
// server using the provided DNS client
func NewSingleLookuperWithClient(server string, recursive bool,
c client.Client) (*SingleLookuper, error) {
//
server, err := exdns.AsServerAddress(server)
if err != nil {
return nil, err
}
if c == nil {
c1 := client.NewDefaultClient(0)
c = client.NewSingleFlight(c1, 0)
}
h := &SingleLookuper{
c: c,
remote: server,
recursive: recursive,
}
return h, nil
}