import dns._asyncbackend
import dns.exception
+import dns.inet
_is_win32 = sys.platform == "win32"
ssl_context=None,
server_hostname=None,
):
- if destination is None and socktype == socket.SOCK_DGRAM and _is_win32:
- raise NotImplementedError(
- "destinationless datagram sockets "
- "are not supported by asyncio "
- "on Windows"
- )
loop = _get_running_loop()
if socktype == socket.SOCK_DGRAM:
+ if _is_win32 and source is None:
+ # Win32 wants explicit binding before recvfrom(). This is the
+ # proper fix for [#637].
+ source = (dns.inet.any_for_af(af), 0)
transport, protocol = await loop.create_datagram_endpoint(
_DatagramProtocol,
source,
await asyncio.sleep(interval)
def datagram_connection_required(self):
- return _is_win32
+ return False
def get_transport_class(self):
return _HTTPTransport
@unittest.skipIf(not tests.util.is_internet_reachable(), "Internet not reachable")
class AsyncTests(unittest.TestCase):
- connect_udp = sys.platform == "win32"
-
def setUp(self):
self.backend = dns.asyncbackend.set_default_backend("asyncio")
qname = dns.name.from_text("dns.google.")
async def run():
- if self.connect_udp:
- dtuple = (address, 53)
- else:
- dtuple = None
async with await self.backend.make_socket(
- dns.inet.af_for_address(address), socket.SOCK_DGRAM, 0, None, dtuple
+ dns.inet.af_for_address(address),
+ socket.SOCK_DGRAM,
+ 0,
+ None,
+ None,
) as s:
q = dns.message.make_query(qname, dns.rdatatype.A)
return await dns.asyncquery.udp(q, address, sock=s, timeout=2)
self.assertFalse(tcp)
def testUDPReceiveQuery(self):
- if self.connect_udp:
- self.skipTest("test needs connectionless sockets")
-
async def run():
async with await self.backend.make_socket(
socket.AF_INET, socket.SOCK_DGRAM, source=("127.0.0.1", 0)
self.assertEqual(sender_address, recv_address)
def testUDPReceiveTimeout(self):
- if self.connect_udp:
- self.skipTest("test needs connectionless sockets")
-
async def arun():
async with await self.backend.make_socket(
socket.AF_INET, socket.SOCK_DGRAM, 0, ("127.0.0.1", 0)
@unittest.skipIf(not tests.util.is_internet_reachable(), "Internet not reachable")
class AsyncioOnlyTests(unittest.TestCase):
- connect_udp = sys.platform == "win32"
-
def setUp(self):
self.backend = dns.asyncbackend.set_default_backend("asyncio")
return asyncio.run(afunc())
def testUseAfterTimeout(self):
- if self.connect_udp:
- self.skipTest("test needs connectionless sockets")
-
# Test #843 fix.
async def run():
qname = dns.name.from_text("dns.google")
return trio.run(afunc)
class TrioAsyncTests(AsyncTests):
- connect_udp = False
-
def setUp(self):
self.backend = dns.asyncbackend.set_default_backend("trio")