mirror of
https://github.com/python/cpython.git
synced 2025-11-09 22:16:39 +00:00
bpo-39148: enable ipv6 for datagrams in Proactor (GH-19121)
Ifdef is not necessary, as AF_INET6 is supported from Windows Vista, and other code in overlapped.c uses AF_INET6 and is not ifdef'd. Change the raised exception so users are not fooled to think it comes from Windows API. Automerge-Triggered-By: @njsmith
This commit is contained in:
parent
da742ba826
commit
442634c42f
3 changed files with 17 additions and 8 deletions
|
|
@ -1208,7 +1208,7 @@ class EventLoopTestsMixin:
|
||||||
ConnectionRefusedError, client.connect, ('127.0.0.1', port))
|
ConnectionRefusedError, client.connect, ('127.0.0.1', port))
|
||||||
client.close()
|
client.close()
|
||||||
|
|
||||||
def test_create_datagram_endpoint(self):
|
def _test_create_datagram_endpoint(self, local_addr, family):
|
||||||
class TestMyDatagramProto(MyDatagramProto):
|
class TestMyDatagramProto(MyDatagramProto):
|
||||||
def __init__(inner_self):
|
def __init__(inner_self):
|
||||||
super().__init__(loop=self.loop)
|
super().__init__(loop=self.loop)
|
||||||
|
|
@ -1218,9 +1218,11 @@ class EventLoopTestsMixin:
|
||||||
self.transport.sendto(b'resp:'+data, addr)
|
self.transport.sendto(b'resp:'+data, addr)
|
||||||
|
|
||||||
coro = self.loop.create_datagram_endpoint(
|
coro = self.loop.create_datagram_endpoint(
|
||||||
TestMyDatagramProto, local_addr=('127.0.0.1', 0))
|
TestMyDatagramProto, local_addr=local_addr, family=family)
|
||||||
s_transport, server = self.loop.run_until_complete(coro)
|
s_transport, server = self.loop.run_until_complete(coro)
|
||||||
host, port = s_transport.get_extra_info('sockname')
|
sockname = s_transport.get_extra_info('sockname')
|
||||||
|
host, port = socket.getnameinfo(
|
||||||
|
sockname, socket.NI_NUMERICHOST|socket.NI_NUMERICSERV)
|
||||||
|
|
||||||
self.assertIsInstance(s_transport, asyncio.Transport)
|
self.assertIsInstance(s_transport, asyncio.Transport)
|
||||||
self.assertIsInstance(server, TestMyDatagramProto)
|
self.assertIsInstance(server, TestMyDatagramProto)
|
||||||
|
|
@ -1254,6 +1256,13 @@ class EventLoopTestsMixin:
|
||||||
self.assertEqual('CLOSED', client.state)
|
self.assertEqual('CLOSED', client.state)
|
||||||
server.transport.close()
|
server.transport.close()
|
||||||
|
|
||||||
|
def test_create_datagram_endpoint(self):
|
||||||
|
self._test_create_datagram_endpoint(('127.0.0.1', 0), socket.AF_INET)
|
||||||
|
|
||||||
|
@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 not supported or enabled')
|
||||||
|
def test_create_datagram_endpoint_ipv6(self):
|
||||||
|
self._test_create_datagram_endpoint(('::1', 0), socket.AF_INET6)
|
||||||
|
|
||||||
def test_create_datagram_endpoint_sock(self):
|
def test_create_datagram_endpoint_sock(self):
|
||||||
sock = None
|
sock = None
|
||||||
local_address = ('127.0.0.1', 0)
|
local_address = ('127.0.0.1', 0)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
Add IPv6 support to :mod:`asyncio` datagram endpoints in ProactorEventLoop.
|
||||||
|
Change the raised exception for unknown address families to ValueError
|
||||||
|
as it's not coming from Windows API.
|
||||||
|
|
@ -670,7 +670,6 @@ make_ipv4_addr(const struct sockaddr_in *addr)
|
||||||
return PyUnicode_FromString(buf);
|
return PyUnicode_FromString(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
/* Convert IPv6 sockaddr to a Python str. */
|
/* Convert IPv6 sockaddr to a Python str. */
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
|
@ -683,7 +682,6 @@ make_ipv6_addr(const struct sockaddr_in6 *addr)
|
||||||
}
|
}
|
||||||
return PyUnicode_FromString(buf);
|
return PyUnicode_FromString(buf);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static PyObject*
|
static PyObject*
|
||||||
unparse_address(LPSOCKADDR Address, DWORD Length)
|
unparse_address(LPSOCKADDR Address, DWORD Length)
|
||||||
|
|
@ -701,7 +699,6 @@ unparse_address(LPSOCKADDR Address, DWORD Length)
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#ifdef ENABLE_IPV6
|
|
||||||
case AF_INET6: {
|
case AF_INET6: {
|
||||||
const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)Address;
|
const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)Address;
|
||||||
PyObject *addrobj = make_ipv6_addr(a);
|
PyObject *addrobj = make_ipv6_addr(a);
|
||||||
|
|
@ -716,9 +713,9 @@ unparse_address(LPSOCKADDR Address, DWORD Length)
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* ENABLE_IPV6 */
|
|
||||||
default: {
|
default: {
|
||||||
return SetFromWindowsErr(ERROR_INVALID_PARAMETER);
|
PyErr_SetString(PyExc_ValueError, "recvfrom returned unsupported address family");
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue