diff --git a/eventlet/greenio.py b/eventlet/greenio.py index 71eab06..a74b61f 100644 --- a/eventlet/greenio.py +++ b/eventlet/greenio.py @@ -6,6 +6,7 @@ import errno import os import socket from socket import socket as _original_socket +import sys import time @@ -88,13 +89,20 @@ def socket_send(descriptor, data, flags=0): return 0 raise -# winsock sometimes throws ENOTCONN -SOCKET_CLOSED = (errno.ECONNRESET, errno.ENOTCONN, errno.ESHUTDOWN) +if sys.platform[:3]=="win": + # winsock sometimes throws ENOTCONN + SOCKET_BLOCKING = (errno.EWOULDBLOCK,) + SOCKET_CLOSED = (errno.ECONNRESET, errno.ENOTCONN, errno.ESHUTDOWN) +else: + # oddly, on linux/darwin, an unconnected socket is expected to block, + # so we treat ENOTCONN the same as EWOULDBLOCK + SOCKET_BLOCKING = (errno.EWOULDBLOCK, errno.ENOTCONN) + SOCKET_CLOSED = (errno.ECONNRESET, errno.ESHUTDOWN) def socket_recv(descriptor, buflen, flags=0): try: return descriptor.recv(buflen, flags) except socket.error, e: - if e[0] == errno.EWOULDBLOCK: + if e[0] in SOCKET_BLOCKING: return None if e[0] in SOCKET_CLOSED: return '' diff --git a/tests/stdlib/test_socket.py b/tests/stdlib/test_socket.py index 9532222..8bf7ed4 100644 --- a/tests/stdlib/test_socket.py +++ b/tests/stdlib/test_socket.py @@ -1,20 +1,19 @@ #!/usr/bin/env python -from test import test_socket - +from eventlet import patcher from eventlet.green import socket from eventlet.green import select from eventlet.green import time from eventlet.green import thread from eventlet.green import threading -test_socket.socket = socket -test_socket.select = select -test_socket.time = time -test_socket.thread = thread -test_socket.threading = threading - -from test.test_socket import * +patcher.inject('test.test_socket', + globals(), + ('socket', socket), + ('select', select), + ('time', time), + ('thread', thread), + ('threading', threading)) if __name__ == "__main__": test_main() \ No newline at end of file