From 41ef54f57041473f1d1984ab8f6e58daea1709bc Mon Sep 17 00:00:00 2001 From: amajorek Date: Sun, 28 Feb 2010 14:53:07 -0500 Subject: [PATCH] New eventlet.common module to create version-neutral layer. For now only get_errno added there. All usage of e[0] replaced with either get_errno(e) or e.args[0] if intnetion was not to extract errno, but first argument --- eventlet/backdoor.py | 4 +++- eventlet/common.py | 19 +++++++++++++++++++ eventlet/green/OpenSSL/SSL.py | 3 ++- eventlet/green/os.py | 2 +- eventlet/green/socket.py | 2 +- eventlet/green/ssl.py | 11 ++++++----- eventlet/greenio.py | 14 +------------- eventlet/hubs/poll.py | 3 ++- eventlet/hubs/selects.py | 9 +++++---- eventlet/wsgi.py | 2 +- examples/websocket.py | 5 +++-- tests/greenio_test.py | 1 + tests/greenpool_test.py | 2 +- tests/wsgi_test.py | 7 ++++--- 14 files changed, 50 insertions(+), 34 deletions(-) create mode 100644 eventlet/common.py diff --git a/eventlet/backdoor.py b/eventlet/backdoor.py index a557bd7..63533f1 100644 --- a/eventlet/backdoor.py +++ b/eventlet/backdoor.py @@ -5,7 +5,9 @@ from code import InteractiveConsole import eventlet from eventlet import hubs +from eventlet.common import get_errno from eventlet.support import greenlets +#FIXME no testcases for bckdor module try: sys.ps1 @@ -86,7 +88,7 @@ def backdoor_server(sock, locals=None): backdoor(socketpair, locals) except socket.error, e: # Broken pipe means it was shutdown - if e[0] != errno.EPIPE: + if get_errno(e) != errno.EPIPE: raise finally: sock.close() diff --git a/eventlet/common.py b/eventlet/common.py new file mode 100644 index 0000000..4710fd3 --- /dev/null +++ b/eventlet/common.py @@ -0,0 +1,19 @@ +def get_errno(exc): + """ Get the error code out of socket.error objects. + socket.error in <2.5 does not have errno attribute + socket.error in 3.x does not allow indexing access + e.args[0] works for all. + There are cases when args[0] is not errno. + i.e. http://bugs.python.org/issue6471 + Maybe there are cases when errno is set, but it is not the first argument? + """ + + try: + if exc.errno is not None: return exc.errno + except AttributeError: + pass + try: + return exc.args[0] + except IndexError: + return None + diff --git a/eventlet/green/OpenSSL/SSL.py b/eventlet/green/OpenSSL/SSL.py index 8e2fe80..3d7fc4a 100644 --- a/eventlet/green/OpenSSL/SSL.py +++ b/eventlet/green/OpenSSL/SSL.py @@ -1,5 +1,6 @@ from OpenSSL import SSL as orig_SSL from OpenSSL.SSL import * +from eventlet.common import get_errno from eventlet import greenio from eventlet.hubs import trampoline import socket @@ -89,7 +90,7 @@ class GreenConnection(greenio.GreenSocket): timeout=self.gettimeout(), timeout_exc=socket.timeout) except SysCallError, e: - if e[0] == -1 or e[0] > 0: + if get_errno(e) == -1 or get_errno(e) > 0: return '' recv = read diff --git a/eventlet/green/os.py b/eventlet/green/os.py index 83e81b5..2751ca1 100644 --- a/eventlet/green/os.py +++ b/eventlet/green/os.py @@ -3,7 +3,7 @@ import errno socket = __import__("socket") from eventlet import greenio -from eventlet.greenio import get_errno +from eventlet.common import get_errno from eventlet import greenthread from eventlet import hubs diff --git a/eventlet/green/socket.py b/eventlet/green/socket.py index 0b3ba55..75fe442 100644 --- a/eventlet/green/socket.py +++ b/eventlet/green/socket.py @@ -94,7 +94,7 @@ def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT): def _convert_to_sslerror(ex): """ Transliterates SSL.SysCallErrors to socket.sslerrors""" - return sslerror((ex[0], ex[1])) + return sslerror((ex.args[0], ex.args[1])) class GreenSSLObject(object): diff --git a/eventlet/green/ssl.py b/eventlet/green/ssl.py index a4c6140..71e2fb6 100644 --- a/eventlet/green/ssl.py +++ b/eventlet/green/ssl.py @@ -6,8 +6,9 @@ for attr in dir(__ssl): import errno time = __import__('time') +from eventlet.common import get_errno from eventlet.hubs import trampoline -from eventlet.greenio import set_nonblocking, GreenSocket, SOCKET_CLOSED, CONNECT_ERR, CONNECT_SUCCESS, get_errno +from eventlet.greenio import set_nonblocking, GreenSocket, SOCKET_CLOSED, CONNECT_ERR, CONNECT_SUCCESS orig_socket = __import__('socket') socket = orig_socket.socket timeout_exc = orig_socket.timeout @@ -105,10 +106,10 @@ class GreenSSLSocket(__ssl.SSLSocket): while True: try: v = self._sslobj.write(data) - except SSLError, x: - if get_errno(x) == SSL_ERROR_WANT_READ: + except SSLError, e: + if get_errno(e) == SSL_ERROR_WANT_READ: return 0 - elif get_errno(x) == SSL_ERROR_WANT_WRITE: + elif get_errno(e) == SSL_ERROR_WANT_WRITE: return 0 else: raise @@ -155,7 +156,7 @@ class GreenSSLSocket(__ssl.SSLSocket): except orig_socket.error, e: if self.act_non_blocking: raise - if ge_errno(e) == errno.EWOULDBLOCK: + if get_errno(e) == errno.EWOULDBLOCK: trampoline(self.fileno(), write=True, timeout=self.gettimeout(), timeout_exc=timeout_exc('timed out')) if get_errno(e) in SOCKET_CLOSED: diff --git a/eventlet/greenio.py b/eventlet/greenio.py index 686febd..32fcd50 100644 --- a/eventlet/greenio.py +++ b/eventlet/greenio.py @@ -1,3 +1,4 @@ +from eventlet.common import get_errno from eventlet.hubs import trampoline BUFFER_SIZE = 4096 @@ -22,19 +23,6 @@ except AttributeError: def _fileobject(sock, *args, **kwargs): return _original_socket.makefile(sock, *args, **kwargs) -def get_errno(exc): - """ Get the error code out of socket.error objects. - socket.error in <2.5 does not have errno attribute - socket.error in 3.x does not allow indexing access - """ - try: - return exc.args[0] - except (TypeError,IndexError): - try: - return exc.errno - except AttributeError: - return None - def socket_connect(descriptor, address): """ Attempts to connect to the address, returns the descriptor if it succeeds, diff --git a/eventlet/hubs/poll.py b/eventlet/hubs/poll.py index 512b008..8bc99b8 100644 --- a/eventlet/hubs/poll.py +++ b/eventlet/hubs/poll.py @@ -5,6 +5,7 @@ select = patcher.original('select') time = patcher.original('time') sleep = time.sleep +from eventlet.common import get_errno from eventlet.hubs.hub import BaseHub, READ, WRITE EXC_MASK = select.POLLERR | select.POLLHUP @@ -78,7 +79,7 @@ class Hub(BaseHub): try: presult = self.poll.poll(seconds * self.WAIT_MULTIPLIER) except select.error, e: - if e.args[0] == errno.EINTR: + if get_errno(e) == errno.EINTR: return raise SYSTEM_EXCEPTIONS = self.SYSTEM_EXCEPTIONS diff --git a/eventlet/hubs/selects.py b/eventlet/hubs/selects.py index 8dcc35f..f84e29a 100644 --- a/eventlet/hubs/selects.py +++ b/eventlet/hubs/selects.py @@ -1,6 +1,7 @@ import sys import errno from eventlet import patcher +from eventlet.common import get_errno select = patcher.original('select') time = patcher.original('time') @@ -20,7 +21,7 @@ class Hub(BaseHub): try: select.select([fd], [], [], 0) except select.error, e: - if e.args[0] == errno.EBADF: + if get_errno(e) == errno.EBADF: self.remove_descriptor(fd) def wait(self, seconds=None): @@ -33,9 +34,9 @@ class Hub(BaseHub): try: r, w, er = select.select(readers.keys(), writers.keys(), readers.keys() + writers.keys(), seconds) except select.error, e: - if e.args[0] == errno.EINTR: + if get_errno(e) == errno.EINTR: return - elif e.args[0] in BAD_SOCK: + elif get_errno(e) in BAD_SOCK: self._remove_bad_fds() return else: @@ -57,4 +58,4 @@ class Hub(BaseHub): raise except: self.squelch_exception(fileno, sys.exc_info()) - sys.exc_clear() \ No newline at end of file + sys.exc_clear() diff --git a/eventlet/wsgi.py b/eventlet/wsgi.py index a3b2641..a00235a 100644 --- a/eventlet/wsgi.py +++ b/eventlet/wsgi.py @@ -10,7 +10,7 @@ from eventlet.green import socket from eventlet.green import BaseHTTPServer from eventlet import greenpool from eventlet import greenio -from eventlet.greenio import get_errno +from eventlet.common import get_errno DEFAULT_MAX_SIMULTANEOUS_REQUESTS = 1024 DEFAULT_MAX_HTTP_VERSION = 'HTTP/1.1' diff --git a/examples/websocket.py b/examples/websocket.py index 2cef80c..fca2fa7 100644 --- a/examples/websocket.py +++ b/examples/websocket.py @@ -3,6 +3,7 @@ import errno from eventlet import wsgi from eventlet import pools import eventlet +from eventlet.common import get_errno class WebSocketWSGI(object): def __init__(self, handler, origin): @@ -37,7 +38,7 @@ class WebSocketWSGI(object): try: self.handler(ws) except socket.error, e: - if wsgi.get_errno(e) != errno.EPIPE: + if get_errno(e) != errno.EPIPE: raise # use this undocumented feature of eventlet.wsgi to ensure that it # doesn't barf on the fact that we didn't call start_response @@ -138,4 +139,4 @@ def dispatch(environ, start_response): if __name__ == "__main__": # run an example app from the command line listener = eventlet.listen(('localhost', 7000)) - wsgi.server(listener, dispatch) \ No newline at end of file + wsgi.server(listener, dispatch) diff --git a/tests/greenio_test.py b/tests/greenio_test.py index d9c626c..2ceeb67 100644 --- a/tests/greenio_test.py +++ b/tests/greenio_test.py @@ -3,6 +3,7 @@ from tests import LimitedTestCase, skip_with_pyevent, main, skipped from eventlet import event from eventlet import greenio from eventlet import debug +from eventlet.common import get_errno from eventlet.green import socket from eventlet.green import time from eventlet.green.socket import GreenSSLObject diff --git a/tests/greenpool_test.py b/tests/greenpool_test.py index f668188..a0a4171 100644 --- a/tests/greenpool_test.py +++ b/tests/greenpool_test.py @@ -379,7 +379,7 @@ class Stress(tests.LimitedTestCase): try: i = it.next() except StressException, exc: - i = exc[0] + i = exc.args[0] except StopIteration: break received += 1 diff --git a/tests/wsgi_test.py b/tests/wsgi_test.py index b822199..c6faec1 100644 --- a/tests/wsgi_test.py +++ b/tests/wsgi_test.py @@ -14,6 +14,7 @@ from eventlet import greenio from eventlet.green import socket as greensocket from eventlet import wsgi from eventlet import processes +from eventlet.common import get_errno from tests import find_command @@ -95,7 +96,7 @@ def read_http(sock): try: response_line = fd.readline() except socket.error, exc: - if exc[0] == 10053: + if get_errno(exc) == 10053: raise ConnectionClosed raise if not response_line: @@ -563,7 +564,7 @@ class TestHttpd(LimitedTestCase): server_sock_2.accept() # shouldn't be able to use this one anymore except socket.error, exc: - self.assertEqual(exc[0], errno.EBADF) + self.assertEqual(get_errno(exc), errno.EBADF) self.spawn_server(sock=server_sock) sock = eventlet.connect(('localhost', self.port)) fd = sock.makefile() @@ -680,7 +681,7 @@ class TestHttpd(LimitedTestCase): eventlet.connect(('localhost', self.port)) self.fail("Didn't expect to connect") except socket.error, exc: - self.assertEquals(exc[0], errno.ECONNREFUSED) + self.assertEquals(get_errno(exc), errno.ECONNREFUSED) self.assert_('Invalid argument' in self.logfile.getvalue(), self.logfile.getvalue())