mirror of
https://github.com/golang/go
synced 2024-09-30 00:24:29 -06:00
net: fall back to hosts file if DNS lookup fails, despite order
Fixes #13090 Change-Id: I5612d792dabdff89bd0cec57dc2cacf9be7ebf64 Reviewed-on: https://go-review.googlesource.com/16341 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
e4e4942387
commit
e614d60759
@ -473,12 +473,12 @@ func goLookupIPOrder(name string, order hostLookupOrder) (addrs []IPAddr, err er
|
||||
}
|
||||
sortByRFC6724(addrs)
|
||||
if len(addrs) == 0 {
|
||||
if lastErr != nil {
|
||||
return nil, lastErr
|
||||
}
|
||||
if order == hostLookupDNSFiles {
|
||||
addrs = goLookupIPFiles(name)
|
||||
}
|
||||
if lastErr != nil {
|
||||
return nil, lastErr
|
||||
}
|
||||
}
|
||||
return addrs, nil
|
||||
}
|
||||
|
@ -378,6 +378,48 @@ func TestGoLookupIPWithResolverConfig(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// Test that goLookupIPOrder falls back to the host file when no DNS servers are available.
|
||||
func TestGoLookupIPOrderFallbackToFile(t *testing.T) {
|
||||
if testing.Short() || !*testExternal {
|
||||
t.Skip("avoid external network")
|
||||
}
|
||||
|
||||
// Add a config that simulates no dns servers being available.
|
||||
conf, err := newResolvConfTest()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := conf.writeAndUpdate([]string{}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
conf.tryUpdate(conf.path)
|
||||
// Redirect host file lookups.
|
||||
defer func(orig string) { testHookHostsPath = orig }(testHookHostsPath)
|
||||
testHookHostsPath = "testdata/hosts"
|
||||
|
||||
for _, order := range []hostLookupOrder{hostLookupFilesDNS, hostLookupDNSFiles} {
|
||||
name := fmt.Sprintf("order %v", order)
|
||||
|
||||
// First ensure that we get an error when contacting a non-existant host.
|
||||
_, err := goLookupIPOrder("notarealhost", order)
|
||||
if err == nil {
|
||||
t.Errorf("%s: expected error while looking up name not in hosts file", name)
|
||||
continue
|
||||
}
|
||||
|
||||
// Now check that we get an address when the name appears in the hosts file.
|
||||
addrs, err := goLookupIPOrder("thor", order) // entry is in "testdata/hosts"
|
||||
if err != nil {
|
||||
t.Errorf("%s: expected to successfully lookup host entry", name)
|
||||
continue
|
||||
}
|
||||
if got, want := addrs, []IPAddr{IPAddr{IP: IP{127, 0, 0, 1}}}; !reflect.DeepEqual(got, want) {
|
||||
t.Errorf("%s: address doesn't match expectation. got %v, want %v", name, got, want)
|
||||
}
|
||||
}
|
||||
defer conf.teardown()
|
||||
}
|
||||
|
||||
func BenchmarkGoLookupIP(b *testing.B) {
|
||||
testHookUninstaller.Do(uninstallTestHooks)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user