Commit ad5dd7b9 authored by Denis Bilenko's avatar Denis Bilenko

do not mask EBADF in socket, ssl, fileobject

- update test__socket_close.py
parent 55934de4
...@@ -115,11 +115,7 @@ else: ...@@ -115,11 +115,7 @@ else:
data = _read(self.fileno(), size) data = _read(self.fileno(), size)
except (IOError, OSError): except (IOError, OSError):
code = sys.exc_info()[1].args[0] code = sys.exc_info()[1].args[0]
if code in ignored_errors: if code not in ignored_errors:
pass
elif code == EBADF:
return ''
else:
raise raise
sys.exc_clear() sys.exc_clear()
else: else:
...@@ -134,13 +130,7 @@ else: ...@@ -134,13 +130,7 @@ else:
if data.endswith('\r'): if data.endswith('\r'):
self._eat_newline = True self._eat_newline = True
return self._translate_newlines(data) return self._translate_newlines(data)
try: self.hub.wait(self._read_event)
self.hub.wait(self._read_event)
except IOError:
ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return ''
raise
def _translate_newlines(self, data): def _translate_newlines(self, data):
data = data.replace("\r\n", "\n") data = data.replace("\r\n", "\n")
......
...@@ -385,20 +385,11 @@ class socket(object): ...@@ -385,20 +385,11 @@ class socket(object):
return sock.recv(*args) return sock.recv(*args)
except error: except error:
ex = sys.exc_info()[1] ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return ''
if ex.args[0] != EWOULDBLOCK or self.timeout == 0.0: if ex.args[0] != EWOULDBLOCK or self.timeout == 0.0:
raise raise
# QQQ without clearing exc_info test__refcount.test_clean_exit fails # QQQ without clearing exc_info test__refcount.test_clean_exit fails
sys.exc_clear() sys.exc_clear()
try: self._wait(self._read_event)
self._wait(self._read_event)
except error:
# if another greenlet called this socket, _wait would fail with EBADF
ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return ''
raise
def recvfrom(self, *args): def recvfrom(self, *args):
sock = self._sock sock = self._sock
...@@ -431,18 +422,10 @@ class socket(object): ...@@ -431,18 +422,10 @@ class socket(object):
return sock.recv_into(*args) return sock.recv_into(*args)
except error: except error:
ex = sys.exc_info()[1] ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0
if ex.args[0] != EWOULDBLOCK or self.timeout == 0.0: if ex.args[0] != EWOULDBLOCK or self.timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
try: self._wait(self._read_event)
self._wait(self._read_event)
except error:
ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0
raise
def send(self, data, flags=0, timeout=timeout_default): def send(self, data, flags=0, timeout=timeout_default):
sock = self._sock sock = self._sock
...@@ -455,13 +438,7 @@ class socket(object): ...@@ -455,13 +438,7 @@ class socket(object):
if ex.args[0] != EWOULDBLOCK or timeout == 0.0: if ex.args[0] != EWOULDBLOCK or timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
try: self._wait(self._write_event)
self._wait(self._write_event)
except error:
ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0
raise
try: try:
return sock.send(data, flags) return sock.send(data, flags)
except error: except error:
......
...@@ -116,25 +116,13 @@ class SSLSocket(socket): ...@@ -116,25 +116,13 @@ class SSLSocket(socket):
if self.timeout == 0.0: if self.timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
try: self._wait(self._read_event, timeout_exc=_SSLErrorReadTimeout)
self._wait(self._read_event, timeout_exc=_SSLErrorReadTimeout)
except socket_error:
ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return ''
raise
elif ex.args[0] == SSL_ERROR_WANT_WRITE: elif ex.args[0] == SSL_ERROR_WANT_WRITE:
if self.timeout == 0.0: if self.timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
try: # note: using _SSLErrorReadTimeout rather than _SSLErrorWriteTimeout below is intentional
# note: using _SSLErrorReadTimeout rather than _SSLErrorWriteTimeout below is intentional self._wait(self._write_event, timeout_exc=_SSLErrorReadTimeout)
self._wait(self._write_event, timeout_exc=_SSLErrorReadTimeout)
except socket_error:
ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return ''
raise
else: else:
raise raise
...@@ -150,24 +138,12 @@ class SSLSocket(socket): ...@@ -150,24 +138,12 @@ class SSLSocket(socket):
if self.timeout == 0.0: if self.timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
try: self._wait(self._read_event, timeout_exc=_SSLErrorWriteTimeout)
self._wait(self._read_event, timeout_exc=_SSLErrorWriteTimeout)
except socket_error:
ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0
raise
elif ex.args[0] == SSL_ERROR_WANT_WRITE: elif ex.args[0] == SSL_ERROR_WANT_WRITE:
if self.timeout == 0.0: if self.timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
try: self._wait(self._write_event, timeout_exc=_SSLErrorWriteTimeout)
self._wait(self._write_event, timeout_exc=_SSLErrorWriteTimeout)
except socket_error:
ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0
raise
else: else:
raise raise
...@@ -201,24 +177,12 @@ class SSLSocket(socket): ...@@ -201,24 +177,12 @@ class SSLSocket(socket):
if self.timeout == 0.0: if self.timeout == 0.0:
return 0 return 0
sys.exc_clear() sys.exc_clear()
try: self._wait(self._read_event)
self._wait(self._read_event)
except socket_error:
ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0
raise
elif x.args[0] == SSL_ERROR_WANT_WRITE: elif x.args[0] == SSL_ERROR_WANT_WRITE:
if self.timeout == 0.0: if self.timeout == 0.0:
return 0 return 0
sys.exc_clear() sys.exc_clear()
try: self._wait(self._write_event)
self._wait(self._write_event)
except socket_error:
ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0
raise
else: else:
raise raise
else: else:
...@@ -267,13 +231,7 @@ class SSLSocket(socket): ...@@ -267,13 +231,7 @@ class SSLSocket(socket):
if self.timeout == 0.0: if self.timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
try: self._wait(self._read_event)
self._wait(self._read_event)
except socket_error:
ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0
raise
continue continue
else: else:
raise raise
...@@ -312,24 +270,12 @@ class SSLSocket(socket): ...@@ -312,24 +270,12 @@ class SSLSocket(socket):
if self.timeout == 0.0: if self.timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
try: self._wait(self._read_event, timeout_exc=_SSLErrorReadTimeout)
self._wait(self._read_event, timeout_exc=_SSLErrorReadTimeout)
except socket_error:
ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return ''
raise
elif ex.args[0] == SSL_ERROR_WANT_WRITE: elif ex.args[0] == SSL_ERROR_WANT_WRITE:
if self.timeout == 0.0: if self.timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
try: self._wait(self._write_event, timeout_exc=_SSLErrorWriteTimeout)
self._wait(self._write_event, timeout_exc=_SSLErrorWriteTimeout)
except socket_error:
ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return ''
raise
else: else:
raise raise
......
...@@ -13,6 +13,8 @@ def readall(socket, address): ...@@ -13,6 +13,8 @@ def readall(socket, address):
class Test(greentest.TestCase): class Test(greentest.TestCase):
error_fatal = False
def setUp(self): def setUp(self):
self.server = server.StreamServer(('', 0), readall) self.server = server.StreamServer(('', 0), readall)
self.server.start() self.server.start()
...@@ -24,20 +26,27 @@ class Test(greentest.TestCase): ...@@ -24,20 +26,27 @@ class Test(greentest.TestCase):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('127.0.0.1', self.server.server_port)) sock.connect(('127.0.0.1', self.server.server_port))
receiver = gevent.spawn(sock.recv, 25) receiver = gevent.spawn(sock.recv, 25)
gevent.sleep(0.001) try:
sock.close() gevent.sleep(0.001)
receiver.join(timeout=0.1) sock.close()
assert receiver.ready(), receiver receiver.join(timeout=0.1)
self.assertEqual(receiver.value, '') assert receiver.ready(), receiver
self.assertEqual(receiver.value, None)
assert isinstance(receiver.exception, socket.error)
self.assertEqual(receiver.exception.errno, socket.EBADF)
finally:
receiver.kill()
def test_recv_twice(self): def test_recv_twice(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('127.0.0.1', self.server.server_port)) sock.connect(('127.0.0.1', self.server.server_port))
receiver = gevent.spawn(sock.recv, 25) receiver = gevent.spawn(sock.recv, 25)
gevent.sleep(0.001) try:
self.assertRaises(AssertionError, sock.recv, 25) gevent.sleep(0.001)
self.assertRaises(AssertionError, sock.recv, 25) self.assertRaises(AssertionError, sock.recv, 25)
receiver.kill() self.assertRaises(AssertionError, sock.recv, 25)
finally:
receiver.kill()
if __name__ == '__main__': if __name__ == '__main__':
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment