mirror of
https://github.com/golang/go
synced 2024-09-30 02:34:40 -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)
|
sortByRFC6724(addrs)
|
||||||
if len(addrs) == 0 {
|
if len(addrs) == 0 {
|
||||||
if lastErr != nil {
|
|
||||||
return nil, lastErr
|
|
||||||
}
|
|
||||||
if order == hostLookupDNSFiles {
|
if order == hostLookupDNSFiles {
|
||||||
addrs = goLookupIPFiles(name)
|
addrs = goLookupIPFiles(name)
|
||||||
}
|
}
|
||||||
|
if lastErr != nil {
|
||||||
|
return nil, lastErr
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return addrs, nil
|
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) {
|
func BenchmarkGoLookupIP(b *testing.B) {
|
||||||
testHookUninstaller.Do(uninstallTestHooks)
|
testHookUninstaller.Do(uninstallTestHooks)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user