Implement loop.create_datagram_endpoint · MagicStack/uvloop@deff28d · GitHub
Skip to content

Commit deff28d

Browse files
author
Yury Selivanov
committed
Implement loop.create_datagram_endpoint
1 parent cc10f73 commit deff28d

7 files changed

Lines changed: 753 additions & 5 deletions

File tree

tests/test_udp.py

Lines changed: 128 additions & 0 deletions

uvloop/dns.pyx

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,62 @@ cdef __convert_sockaddr_to_pyaddr(system.sockaddr* addr):
3939
raise RuntimeError("cannot convert sockaddr into Python object")
4040

4141

42+
cdef __convert_pyaddr_to_sockaddr(int family, object addr,
43+
system.sockaddr* res):
44+
cdef:
45+
int err
46+
int port
47+
int addr_len
48+
int scope_id = 0
49+
int flowinfo = 0
50+
51+
if family == uv.AF_INET:
52+
if not isinstance(addr, tuple):
53+
raise TypeError('AF_INET address must be tuple')
54+
if len(addr) != 2:
55+
raise ValueError('AF_INET address must be tuple of (host, port)')
56+
host, port = addr
57+
if isinstance(host, str):
58+
host = host.encode()
59+
if not isinstance(host, (bytes, bytearray)):
60+
raise TypeError('host must be a string or bytes object')
61+
62+
err = uv.uv_ip4_addr(host, port, <system.sockaddr_in*>res)
63+
if err < 0:
64+
raise convert_error(err)
65+
66+
elif family == uv.AF_INET6:
67+
if not isinstance(addr, tuple):
68+
raise TypeError('AF_INET6 address must be tuple')
69+
70+
addr_len = len(addr)
71+
if addr_len < 2 or addr_len > 4:
72+
raise ValueError(
73+
'AF_INET6 must be a tuple of 2-4 parameters: '
74+
'(host, port, flowinfo?, scope_id?)')
75+
76+
host = addr[0]
77+
if isinstance(host, str):
78+
host = host.encode()
79+
80+
port = addr[1]
81+
if addr_len > 2:
82+
flowinfo = addr[2]
83+
if addr_len > 3:
84+
scope_id = addr[3]
85+
86+
err = uv.uv_ip6_addr(host, port, <system.sockaddr_in6*>res)
87+
if err < 0:
88+
raise convert_error(err)
89+
90+
(<system.sockaddr_in6*>res).sin6_flowinfo = flowinfo
91+
(<system.sockaddr_in6*>res).sin6_scope_id = scope_id
92+
93+
else:
94+
raise ValueError(
95+
'epected AF_INET or AF_INET6 family, got {}'.format(family))
96+
97+
4298
@cython.freelist(DEFAULT_FREELIST_SIZE)
4399
cdef class AddrInfo:
44100
cdef:
@@ -58,6 +114,7 @@ cdef class AddrInfo:
58114
cdef unpack(self):
59115
cdef:
60116
list result = []
117+
system.addrinfo *ptr
61118

62119
if self.data is NULL:
63120
raise RuntimeError('AddrInfo.data is NULL')

uvloop/handles/udp.pxd

Lines changed: 24 additions & 0 deletions

0 commit comments

Comments
 (0)