| 
					
				 | 
			
			
				@@ -55,6 +55,19 @@ func (p *AddressParser) readPort(b *buf.Buffer, reader io.Reader) (net.Port, err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return net.PortFromBytes(b.BytesFrom(-2)), nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func maybeIPPrefix(b byte) bool { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return b == '[' || (b >= '0' && b <= '9') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func isValidDomain(d string) bool { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, c := range d { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '-' || c == '.') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (p *AddressParser) readAddress(b *buf.Buffer, reader io.Reader) (net.Address, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err := b.AppendSupplier(buf.ReadFullFrom(reader, 1)); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return nil, err 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -89,7 +102,17 @@ func (p *AddressParser) readAddress(b *buf.Buffer, reader io.Reader) (net.Addres 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err := b.AppendSupplier(buf.ReadFullFrom(reader, domainLength)); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return nil, err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return net.DomainAddress(string(b.BytesFrom(-domainLength))), nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		domain := string(b.BytesFrom(-domainLength)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if maybeIPPrefix(domain[0]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			addr := net.ParseAddress(domain) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if addr.Family().IsIPv4() || addrFamily.IsIPv6() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return addr, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if !isValidDomain(domain) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return nil, newError("invalid domain name: ", domain) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return net.DomainAddress(domain), nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	default: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		panic("impossible case") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 |