@@ -22,13 +22,21 @@ import (
22
22
"strings"
23
23
)
24
24
25
- type dnsResolver struct {}
25
+ type dnsResolver struct {
26
+ res dnsTXTResolver
27
+ }
28
+
29
+ type dnsTXTResolver interface {
30
+ LookupTXT (context.Context , string ) ([]string , error )
31
+ }
26
32
27
33
var _ resolver = & dnsResolver {}
28
34
35
+ const scionAddrTXTTag = "scion="
36
+
29
37
// Resolve the name via DNS to return one scionAddr or an error.
30
38
func (d * dnsResolver ) Resolve (ctx context.Context , name string ) (saddr scionAddr , err error ) {
31
- addresses , err := queryTXTRecord (ctx , name )
39
+ addresses , err := d . queryTXTRecord (ctx , name )
32
40
if err != nil {
33
41
return scionAddr {}, err
34
42
}
@@ -44,12 +52,14 @@ func (d *dnsResolver) Resolve(ctx context.Context, name string) (saddr scionAddr
44
52
45
53
// queryTXTRecord queries the DNS for DNS TXT record(s) specifying the SCION address(es) for host.
46
54
// Returns either at least one address, or else an error, of type HostNotFoundError if no matching record was found.
47
- func queryTXTRecord (ctx context.Context , host string ) (addresses []string , err error ) {
55
+ func (d * dnsResolver ) queryTXTRecord (ctx context.Context , host string ) (addresses []string , err error ) {
56
+ if d .res == nil {
57
+ return addresses , fmt .Errorf ("invalid DNS resolver: %v" , d .res )
58
+ }
48
59
if ! strings .HasSuffix (host , "." ) {
49
60
host += "."
50
61
}
51
- resolver := net.Resolver {}
52
- txtRecords , err := resolver .LookupTXT (ctx , host )
62
+ txtRecords , err := d .res .LookupTXT (ctx , host )
53
63
var errDNSError * net.DNSError
54
64
if errors .As (err , & errDNSError ) {
55
65
if errDNSError .IsNotFound {
@@ -60,8 +70,8 @@ func queryTXTRecord(ctx context.Context, host string) (addresses []string, err e
60
70
return addresses , err
61
71
}
62
72
for _ , txt := range txtRecords {
63
- if strings .HasPrefix (txt , "scion=" ) {
64
- addresses = append (addresses , strings .TrimPrefix (txt , "scion=" ))
73
+ if strings .HasPrefix (txt , scionAddrTXTTag ) {
74
+ addresses = append (addresses , strings .TrimPrefix (txt , scionAddrTXTTag ))
65
75
}
66
76
}
67
77
if len (addresses ) == 0 {
0 commit comments