From 9e0b864ac07ab85b618ccf3831eae97b2c91fb2e Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Tue, 14 Sep 2010 18:00:02 +0000 Subject: Issue #1552: socket.socketpair() now returns regular socket.socket objects supporting the whole socket API (rather than the "raw" _socket.socket objects). --- Doc/library/socket.rst | 4 ++++ Lib/socket.py | 21 +++++++++++++++++++++ Lib/test/test_socket.py | 18 ++++++++++++++++++ Misc/NEWS | 4 ++++ 4 files changed, 47 insertions(+) diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index a7656c1..c7d7ee3 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -364,6 +364,10 @@ The module :mod:`socket` exports the following constants and functions: if defined on the platform; otherwise, the default is :const:`AF_INET`. Availability: Unix. + .. versionchanged:: 3.2 + The returned socket objects now support the whole socket API, rather + than a subset. + .. function:: fromfd(fd, family, type[, proto]) diff --git a/Lib/socket.py b/Lib/socket.py index bfc9a726..9b5b23d 100644 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -199,6 +199,27 @@ def fromfd(fd, family, type, proto=0): return socket(family, type, proto, nfd) +if hasattr(_socket, "socketpair"): + + def socketpair(family=None, type=SOCK_STREAM, proto=0): + """socketpair([family[, type[, proto]]]) -> (socket object, socket object) + + Create a pair of socket objects from the sockets returned by the platform + socketpair() function. + The arguments are the same as for socket() except the default family is + AF_UNIX if defined on the platform; otherwise, the default is AF_INET. + """ + if family is None: + try: + family = AF_UNIX + except NameError: + family = AF_INET + a, b = _socket.socketpair(family, type, proto) + a = socket(family, type, proto, a.detach()) + b = socket(family, type, proto, b.detach()) + return a, b + + class SocketIO(io.RawIOBase): """Raw I/O implementation for stream sockets. diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 05b6ca7..690d9b5 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -714,6 +714,7 @@ class BasicTCPTest(SocketConnectedTest): # Testing fromfd() fd = self.cli_conn.fileno() sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM) + self.assertIsInstance(sock, socket.socket) msg = sock.recv(1024) self.assertEqual(msg, MSG) @@ -814,6 +815,23 @@ class BasicSocketPairTest(SocketPairTest): def __init__(self, methodName='runTest'): SocketPairTest.__init__(self, methodName=methodName) + def _testDefaults(self): + pass + + def testDefaults(self): + self.assertIsInstance(self.cli, socket.socket) + self.assertIsInstance(self.serv, socket.socket) + if hasattr(socket, 'AF_UNIX'): + self.assertEqual(self.cli.family, socket.AF_UNIX) + self.assertEqual(self.serv.family, socket.AF_UNIX) + else: + self.assertEqual(self.cli.family, socket.AF_INET) + self.assertEqual(self.serv.family, socket.AF_INET) + self.assertEqual(self.cli.type, socket.SOCK_STREAM) + self.assertEqual(self.serv.type, socket.SOCK_STREAM) + self.assertEqual(self.cli.proto, 0) + self.assertEqual(self.serv.proto, 0) + def testRecv(self): msg = self.serv.recv(1024) self.assertEqual(msg, MSG) diff --git a/Misc/NEWS b/Misc/NEWS index c6ae1ce..8dba55b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -52,6 +52,10 @@ Core and Builtins Library ------- +- Issue #1552: socket.socketpair() now returns regular socket.socket + objects supporting the whole socket API (rather than the "raw" + _socket.socket objects). + - Issue #9853: Fix the signature of SSLSocket.recvfrom() and SSLSocket.sendto() to match the corresponding socket methods. -- cgit v0.12