resolveHost: Check expected address family on returned address
The code as is never checks the requested address family when doing a DNS query, so resolving an IPv6 only host with AddressFamily.INET would still return an IPv6.
This commit is contained in:
parent
eef6be673b
commit
467c6a0996
|
@ -58,10 +58,14 @@ NetworkAddress resolveHost(string host, ushort address_family, bool use_dns = tr
|
|||
cb => eventDriver.dns.lookupHost(host, cb),
|
||||
(cb, id) => eventDriver.dns.cancelLookup(id),
|
||||
(DNSLookupID, DNSStatus status, scope RefAddress[] addrs) {
|
||||
if (status == DNSStatus.ok && addrs.length > 0) {
|
||||
try res = NetworkAddress(addrs[0]);
|
||||
catch (Exception e) { logDiagnostic("Failed to store address from DNS lookup: %s", e.msg); }
|
||||
success = true;
|
||||
if (status == DNSStatus.ok) {
|
||||
foreach (addr; addrs) {
|
||||
if (address_family != AddressFamily.UNSPEC && addr.addressFamily != address_family) continue;
|
||||
try res = NetworkAddress(addr);
|
||||
catch (Exception e) { logDiagnostic("Failed to store address from DNS lookup: %s", e.msg); }
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
|
39
tests/pull-218-resolvehost-dns-address-family.d
Normal file
39
tests/pull-218-resolvehost-dns-address-family.d
Normal file
|
@ -0,0 +1,39 @@
|
|||
/+ dub.sdl:
|
||||
name "test"
|
||||
dependency "vibe-core" path=".."
|
||||
+/
|
||||
module test;
|
||||
|
||||
import std.socket: AddressFamily;
|
||||
|
||||
import vibe.core.core;
|
||||
import vibe.core.net;
|
||||
|
||||
void main()
|
||||
{
|
||||
runTask({
|
||||
scope(exit) exitEventLoop();
|
||||
|
||||
auto addr = resolveHost("ip6.me", AddressFamily.INET);
|
||||
assert(addr.family == AddressFamily.INET);
|
||||
|
||||
addr = resolveHost("ip6.me", AddressFamily.INET6);
|
||||
assert(addr.family == AddressFamily.INET6);
|
||||
|
||||
try
|
||||
{
|
||||
resolveHost("ip4only.me", AddressFamily.INET6);
|
||||
assert(false);
|
||||
}
|
||||
catch(Exception) {}
|
||||
|
||||
try
|
||||
{
|
||||
resolveHost("ip6only.me", AddressFamily.INET);
|
||||
assert(false);
|
||||
}
|
||||
catch(Exception) {}
|
||||
});
|
||||
|
||||
runEventLoop();
|
||||
}
|
Loading…
Reference in a new issue