mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 10:13:14 -04:00 
			
		
		
		
	Fix HostPortOrFile to support IPv6 addresses with zone (#3527)
1. The HostPortOrFile tests don't have any IPv6 tests. This adds some. 2. The HostPortOrFile breaks if any of the addresses have IPv6 zone defined. ParseIP does not handle %zone anymore. Signed-off-by: Brad P. Crochet <brad@redhat.com>
This commit is contained in:
		
				
					committed by
					
						 Miek Gieben
						Miek Gieben
					
				
			
			
				
	
			
			
			
						parent
						
							b7977402d6
						
					
				
				
					commit
					aa8c325d4a
				
			| @@ -4,12 +4,23 @@ import ( | ||||
| 	"fmt" | ||||
| 	"net" | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/coredns/coredns/plugin/pkg/transport" | ||||
|  | ||||
| 	"github.com/miekg/dns" | ||||
| ) | ||||
|  | ||||
| // Strips the zone, but preserves any port that comes after the zone | ||||
| func stripZone(host string) string { | ||||
| 	if strings.Contains(host, "%") { | ||||
| 		lastPercent := strings.LastIndex(host, "%") | ||||
| 		newHost := host[:lastPercent] | ||||
| 		return newHost | ||||
| 	} | ||||
| 	return host | ||||
| } | ||||
|  | ||||
| // HostPortOrFile parses the strings in s, each string can either be a | ||||
| // address, [scheme://]address:port or a filename. The address part is checked | ||||
| // and in case of filename a resolv.conf like file is (assumed) and parsed and | ||||
| @@ -21,10 +32,11 @@ func HostPortOrFile(s ...string) ([]string, error) { | ||||
| 		trans, host := Transport(h) | ||||
|  | ||||
| 		addr, _, err := net.SplitHostPort(host) | ||||
|  | ||||
| 		if err != nil { | ||||
| 			// Parse didn't work, it is not a addr:port combo | ||||
| 			if net.ParseIP(host) == nil { | ||||
| 				// Not an IP address. | ||||
| 			hostNoZone := stripZone(host) | ||||
| 			if net.ParseIP(hostNoZone) == nil { | ||||
| 				ss, err := tryFile(host) | ||||
| 				if err == nil { | ||||
| 					servers = append(servers, ss...) | ||||
| @@ -47,8 +59,7 @@ func HostPortOrFile(s ...string) ([]string, error) { | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		if net.ParseIP(addr) == nil { | ||||
| 			// Not an IP address. | ||||
| 		if net.ParseIP(stripZone(addr)) == nil { | ||||
| 			ss, err := tryFile(host) | ||||
| 			if err == nil { | ||||
| 				servers = append(servers, ss...) | ||||
|   | ||||
| @@ -34,6 +34,26 @@ func TestHostPortOrFile(t *testing.T) { | ||||
| 			"127.0.0.1:53", | ||||
| 			false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			"fe80::1", | ||||
| 			"[fe80::1]:53", | ||||
| 			false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			"fe80::1%ens3", | ||||
| 			"[fe80::1%ens3]:53", | ||||
| 			false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			"[fd01::1]:153", | ||||
| 			"[fd01::1]:153", | ||||
| 			false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			"[fd01::1%ens3]:153", | ||||
| 			"[fd01::1%ens3]:153", | ||||
| 			false, | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	err := ioutil.WriteFile("resolv.conf", []byte("nameserver 127.0.0.1\n"), 0600) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user