Skip to content

Commit 3060ceb

Browse files
authored
Add support for special hostname <broadcast> (#592)
1 parent 3ea5c85 commit 3060ceb

File tree

3 files changed

+24
-0
lines changed

3 files changed

+24
-0
lines changed

tests/test_dns.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,10 @@ def test_getaddrinfo_22(self):
217217
self._test_getaddrinfo(payload, 80)
218218
self._test_getaddrinfo(payload, 80, type=socket.SOCK_STREAM)
219219

220+
def test_getaddrinfo_broadcast(self):
221+
self._test_getaddrinfo('<broadcast>', 80)
222+
self._test_getaddrinfo('<broadcast>', 80, type=socket.SOCK_STREAM)
223+
220224
######
221225

222226
def test_getnameinfo_1(self):

tests/test_udp.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,22 @@ def test_udp_sendto_dns(self):
378378
s_transport.close()
379379
self.loop.run_until_complete(asyncio.sleep(0.01))
380380

381+
def test_udp_sendto_broadcast(self):
382+
coro = self.loop.create_datagram_endpoint(
383+
asyncio.DatagramProtocol,
384+
local_addr=('127.0.0.1', 0),
385+
family=socket.AF_INET)
386+
387+
s_transport, server = self.loop.run_until_complete(coro)
388+
389+
try:
390+
s_transport.sendto(b'aaaa', ('<broadcast>', 80))
391+
except ValueError as exc:
392+
raise AssertionError('sendto raises {}.'.format(exc))
393+
394+
s_transport.close()
395+
self.loop.run_until_complete(asyncio.sleep(0.01))
396+
381397
def test_send_after_close(self):
382398
coro = self.loop.create_datagram_endpoint(
383399
asyncio.DatagramProtocol,

uvloop/handles/udp.pyx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,10 @@ cdef class UDPTransport(UVBaseTransport):
208208
if addr is None:
209209
saddr = NULL
210210
else:
211+
# resolve special hostname <broadcast> to the broadcast address before use
212+
if self._family == uv.AF_INET and addr[0] == '<broadcast>':
213+
addr = (b'255.255.255.255', addr[1])
214+
211215
try:
212216
__convert_pyaddr_to_sockaddr(self._family, addr,
213217
<system.sockaddr*>&saddr_st)

0 commit comments

Comments
 (0)