diff --git a/dns.go b/dns.go index 8ec4633..48649b9 100644 --- a/dns.go +++ b/dns.go @@ -3,6 +3,7 @@ package main import ( "context" "crypto/tls" + "errors" "net" "sync" "time" @@ -10,6 +11,10 @@ import ( "github.com/fumiama/terasu" ) +var ( + ErrNoDNSAvailable = errors.New("no dns available") +) + var dnsdialer = net.Dialer{ Timeout: time.Second * 8, } @@ -51,6 +56,8 @@ func (ds *dnsservers) add(m map[string][]string) { } func (ds *dnsservers) dial(ctx context.Context) (tlsConn *tls.Conn, err error) { + err = ErrNoDNSAvailable + ds.RLock() defer ds.RUnlock() diff --git a/dns_test.go b/dns_test.go index 3d075e5..dad8dc1 100644 --- a/dns_test.go +++ b/dns_test.go @@ -6,17 +6,21 @@ import ( "fmt" "net" "testing" + "time" "github.com/fumiama/terasu" ) func TestResolver(t *testing.T) { t.Log("canUseIPv6:", canUseIPv6.Get()) - addrs, err := resolver.LookupHost(context.TODO(), "dns.google") + addrs, err := resolver.LookupHost(context.TODO(), "api.mangacopy.com") if err != nil { t.Fatal(err) } t.Log(addrs) + if len(addrs) == 0 { + t.Fail() + } } func TestDNS(t *testing.T) { @@ -24,6 +28,39 @@ func TestDNS(t *testing.T) { dotv6servers.test() } dotv4servers.test() + for i := 0; i < 100; i++ { + addrs, err := resolver.LookupHost(context.TODO(), "api.mangacopy.com") + if err != nil { + t.Fatal(err) + } + t.Log(addrs) + if len(addrs) == 0 { + t.Fail() + } + time.Sleep(time.Millisecond * 50) + } +} + +func TestBadDNS(t *testing.T) { + if canUseIPv6.Get() { + dotv6servers = dnsservers{ + m: map[string][]*dnsstat{}, + } + dotv6servers.add(map[string][]string{"test.bad.host": {"169.254.122.111"}}) + } else { + dotv4servers = dnsservers{ + m: map[string][]*dnsstat{}, + } + dotv4servers.add(map[string][]string{"test.bad.host": {"169.254.122.111:853"}}) + } + for i := 0; i < 10; i++ { + addrs, err := resolver.LookupHost(context.TODO(), "api.mangacopy.com") + t.Log(err) + if err == nil && len(addrs) > 0 { + t.Fatal("unexpected") + } + time.Sleep(time.Millisecond * 50) + } } func (ds *dnsservers) test() { diff --git a/http.go b/http.go index bf6b1e0..29d4e9d 100644 --- a/http.go +++ b/http.go @@ -20,6 +20,10 @@ import ( "golang.org/x/net/http2" ) +var ( + ErrEmptyHostAddress = errors.New("empty host addr") +) + var httpdialer = net.Dialer{ Timeout: time.Minute, } @@ -56,7 +60,7 @@ var cli = comandyClient(http.Client{ lookupTable.Set(host, addrs) } if len(addr) == 0 { - return nil, errors.New("empty host addr") + return nil, ErrEmptyHostAddress } var tlsConn *tls.Conn for _, a := range addrs {