[Python-checkins] cpython (3.4): Close #22063: socket operations (socket,recv, sock_sendall, sock_connect,

victor.stinner python-checkins at python.org
Tue Jul 29 23:11:25 CEST 2014


http://hg.python.org/cpython/rev/7e70ec207889
changeset:   91929:7e70ec207889
branch:      3.4
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Tue Jul 29 23:08:17 2014 +0200
summary:
  Close #22063: socket operations (socket,recv, sock_sendall, sock_connect,
sock_accept) now raise an exception in debug mode if sockets are in blocking
mode.

files:
  Lib/asyncio/proactor_events.py       |   8 +++++++
  Lib/asyncio/selector_events.py       |   8 +++++++
  Lib/test/test_asyncio/test_events.py |  18 ++++++++++++++++
  3 files changed, 34 insertions(+), 0 deletions(-)


diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py
--- a/Lib/asyncio/proactor_events.py
+++ b/Lib/asyncio/proactor_events.py
@@ -385,12 +385,18 @@
         self._selector = None
 
     def sock_recv(self, sock, n):
+        if self.get_debug() and sock.gettimeout() != 0:
+            raise ValueError("the socket must be non-blocking")
         return self._proactor.recv(sock, n)
 
     def sock_sendall(self, sock, data):
+        if self.get_debug() and sock.gettimeout() != 0:
+            raise ValueError("the socket must be non-blocking")
         return self._proactor.send(sock, data)
 
     def sock_connect(self, sock, address):
+        if self.get_debug() and sock.gettimeout() != 0:
+            raise ValueError("the socket must be non-blocking")
         try:
             base_events._check_resolved_address(sock, address)
         except ValueError as err:
@@ -401,6 +407,8 @@
             return self._proactor.connect(sock, address)
 
     def sock_accept(self, sock):
+        if self.get_debug() and sock.gettimeout() != 0:
+            raise ValueError("the socket must be non-blocking")
         return self._proactor.accept(sock)
 
     def _socketpair(self):
diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py
--- a/Lib/asyncio/selector_events.py
+++ b/Lib/asyncio/selector_events.py
@@ -256,6 +256,8 @@
 
         This method is a coroutine.
         """
+        if self.get_debug() and sock.gettimeout() != 0:
+            raise ValueError("the socket must be non-blocking")
         fut = futures.Future(loop=self)
         self._sock_recv(fut, False, sock, n)
         return fut
@@ -292,6 +294,8 @@
 
         This method is a coroutine.
         """
+        if self.get_debug() and sock.gettimeout() != 0:
+            raise ValueError("the socket must be non-blocking")
         fut = futures.Future(loop=self)
         if data:
             self._sock_sendall(fut, False, sock, data)
@@ -333,6 +337,8 @@
 
         This method is a coroutine.
         """
+        if self.get_debug() and sock.gettimeout() != 0:
+            raise ValueError("the socket must be non-blocking")
         fut = futures.Future(loop=self)
         try:
             base_events._check_resolved_address(sock, address)
@@ -374,6 +380,8 @@
 
         This method is a coroutine.
         """
+        if self.get_debug() and sock.gettimeout() != 0:
+            raise ValueError("the socket must be non-blocking")
         fut = futures.Future(loop=self)
         self._sock_accept(fut, False, sock)
         return fut
diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py
--- a/Lib/test/test_asyncio/test_events.py
+++ b/Lib/test/test_asyncio/test_events.py
@@ -383,6 +383,24 @@
         self.assertEqual(read, data)
 
     def _basetest_sock_client_ops(self, httpd, sock):
+        # in debug mode, socket operations must fail
+        # if the socket is not in blocking mode
+        self.loop.set_debug(True)
+        sock.setblocking(True)
+        with self.assertRaises(ValueError):
+            self.loop.run_until_complete(
+                self.loop.sock_connect(sock, httpd.address))
+        with self.assertRaises(ValueError):
+            self.loop.run_until_complete(
+                self.loop.sock_sendall(sock, b'GET / HTTP/1.0\r\n\r\n'))
+        with self.assertRaises(ValueError):
+            self.loop.run_until_complete(
+                self.loop.sock_recv(sock, 1024))
+        with self.assertRaises(ValueError):
+            self.loop.run_until_complete(
+                self.loop.sock_accept(sock))
+
+        # test in non-blocking mode
         sock.setblocking(False)
         self.loop.run_until_complete(
             self.loop.sock_connect(sock, httpd.address))

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list