diff options
| -rw-r--r-- | src/net/hosts.go | 19 | ||||
| -rw-r--r-- | src/net/hosts_test.go | 25 | ||||
| -rw-r--r-- | src/net/testdata/case-hosts | 2 | ||||
| -rw-r--r-- | src/net/testdata/hosts | 2 |
4 files changed, 38 insertions, 10 deletions
diff --git a/src/net/hosts.go b/src/net/hosts.go index aba2cea787..8cf73fd5db 100644 --- a/src/net/hosts.go +++ b/src/net/hosts.go @@ -27,11 +27,21 @@ func parseLiteralIP(addr string) string { return ip.String() + "%" + zone } -// Simple cache. +// hosts contains known host entries. var hosts struct { sync.Mutex + + // Key for the list of literal IP addresses must be a host + // name. It would be part of DNS labels, a FQDN or an absolute + // FQDN. + // For now the key is converted to lower case for convenience. byName map[string][]string + + // Key for the list of host names must be a literal IP address + // including IPv6 address with zone identifier. + // We don't support old-classful IP address notation. byAddr map[string][]string + expire time.Time path string } @@ -60,11 +70,12 @@ func readHosts() { continue } for i := 1; i < len(f); i++ { + name := f[i] h := []byte(f[i]) lowerASCIIBytes(h) - lh := string(h) - hs[lh] = append(hs[lh], addr) - is[addr] = append(is[addr], lh) + key := string(h) + hs[key] = append(hs[key], addr) + is[addr] = append(is[addr], name) } } // Update the data cache. diff --git a/src/net/hosts_test.go b/src/net/hosts_test.go index 99569cd016..a3173ff9ef 100644 --- a/src/net/hosts_test.go +++ b/src/net/hosts_test.go @@ -6,6 +6,7 @@ package net import ( "reflect" + "strings" "testing" ) @@ -48,6 +49,13 @@ var lookupStaticHostTests = []struct { {"localhost.localdomain", []string{"fe80::3%lo0"}}, }, }, + { + "testdata/case-hosts", // see golang.org/issue/12806 + []staticHostEntry{ + {"PreserveMe", []string{"127.0.0.1", "::1"}}, + {"PreserveMe.local", []string{"127.0.0.1", "::1"}}, + }, + }, } func TestLookupStaticHost(t *testing.T) { @@ -56,9 +64,12 @@ func TestLookupStaticHost(t *testing.T) { for _, tt := range lookupStaticHostTests { testHookHostsPath = tt.name for _, ent := range tt.ents { - addrs := lookupStaticHost(ent.in) - if !reflect.DeepEqual(addrs, ent.out) { - t.Errorf("%s, lookupStaticHost(%s) = %v; want %v", tt.name, ent.in, addrs, ent.out) + ins := []string{ent.in, strings.ToLower(ent.in), strings.ToUpper(ent.in)} + for _, in := range ins { + addrs := lookupStaticHost(in) + if !reflect.DeepEqual(addrs, ent.out) { + t.Errorf("%s, lookupStaticHost(%s) = %v; want %v", tt.name, in, addrs, ent.out) + } } } } @@ -74,7 +85,6 @@ var lookupStaticAddrTests = []struct { {"255.255.255.255", []string{"broadcasthost"}}, {"127.0.0.2", []string{"odin"}}, {"127.0.0.3", []string{"odin"}}, - {"127.0.0.4", []string{"bor"}}, {"::2", []string{"odin"}}, {"127.1.1.1", []string{"thor"}}, {"127.1.1.2", []string{"ullr", "ullrhost"}}, @@ -104,6 +114,13 @@ var lookupStaticAddrTests = []struct { {"fe80::3%lo0", []string{"localhost", "localhost.localdomain"}}, }, }, + { + "testdata/case-hosts", // see golang.org/issue/12806 + []staticHostEntry{ + {"127.0.0.1", []string{"PreserveMe", "PreserveMe.local"}}, + {"::1", []string{"PreserveMe", "PreserveMe.local"}}, + }, + }, } func TestLookupStaticAddr(t *testing.T) { diff --git a/src/net/testdata/case-hosts b/src/net/testdata/case-hosts new file mode 100644 index 0000000000..1f30df1179 --- /dev/null +++ b/src/net/testdata/case-hosts @@ -0,0 +1,2 @@ +127.0.0.1 PreserveMe PreserveMe.local +::1 PreserveMe PreserveMe.local diff --git a/src/net/testdata/hosts b/src/net/testdata/hosts index 4b8abb431c..b601763898 100644 --- a/src/net/testdata/hosts +++ b/src/net/testdata/hosts @@ -1,8 +1,6 @@ 255.255.255.255 broadcasthost 127.0.0.2 odin 127.0.0.3 odin # inline comment -# case insensitivity -127.0.0.4 Bor ::2 odin 127.1.1.1 thor # aliases |
