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
This commit is contained in:
amajorek
2010-02-28 14:53:07 -05:00
parent 44b615c8d3
commit 41ef54f570
14 changed files with 50 additions and 34 deletions

View File

@@ -5,7 +5,9 @@ from code import InteractiveConsole
import eventlet import eventlet
from eventlet import hubs from eventlet import hubs
from eventlet.common import get_errno
from eventlet.support import greenlets from eventlet.support import greenlets
#FIXME no testcases for bckdor module
try: try:
sys.ps1 sys.ps1
@@ -86,7 +88,7 @@ def backdoor_server(sock, locals=None):
backdoor(socketpair, locals) backdoor(socketpair, locals)
except socket.error, e: except socket.error, e:
# Broken pipe means it was shutdown # Broken pipe means it was shutdown
if e[0] != errno.EPIPE: if get_errno(e) != errno.EPIPE:
raise raise
finally: finally:
sock.close() sock.close()

19
eventlet/common.py Normal file
View File

@@ -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

View File

@@ -1,5 +1,6 @@
from OpenSSL import SSL as orig_SSL from OpenSSL import SSL as orig_SSL
from OpenSSL.SSL import * from OpenSSL.SSL import *
from eventlet.common import get_errno
from eventlet import greenio from eventlet import greenio
from eventlet.hubs import trampoline from eventlet.hubs import trampoline
import socket import socket
@@ -89,7 +90,7 @@ class GreenConnection(greenio.GreenSocket):
timeout=self.gettimeout(), timeout=self.gettimeout(),
timeout_exc=socket.timeout) timeout_exc=socket.timeout)
except SysCallError, e: except SysCallError, e:
if e[0] == -1 or e[0] > 0: if get_errno(e) == -1 or get_errno(e) > 0:
return '' return ''
recv = read recv = read

View File

@@ -3,7 +3,7 @@ import errno
socket = __import__("socket") socket = __import__("socket")
from eventlet import greenio from eventlet import greenio
from eventlet.greenio import get_errno from eventlet.common import get_errno
from eventlet import greenthread from eventlet import greenthread
from eventlet import hubs from eventlet import hubs

View File

@@ -94,7 +94,7 @@ def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT):
def _convert_to_sslerror(ex): def _convert_to_sslerror(ex):
""" Transliterates SSL.SysCallErrors to socket.sslerrors""" """ Transliterates SSL.SysCallErrors to socket.sslerrors"""
return sslerror((ex[0], ex[1])) return sslerror((ex.args[0], ex.args[1]))
class GreenSSLObject(object): class GreenSSLObject(object):

View File

@@ -6,8 +6,9 @@ for attr in dir(__ssl):
import errno import errno
time = __import__('time') time = __import__('time')
from eventlet.common import get_errno
from eventlet.hubs import trampoline 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') orig_socket = __import__('socket')
socket = orig_socket.socket socket = orig_socket.socket
timeout_exc = orig_socket.timeout timeout_exc = orig_socket.timeout
@@ -105,10 +106,10 @@ class GreenSSLSocket(__ssl.SSLSocket):
while True: while True:
try: try:
v = self._sslobj.write(data) v = self._sslobj.write(data)
except SSLError, x: except SSLError, e:
if get_errno(x) == SSL_ERROR_WANT_READ: if get_errno(e) == SSL_ERROR_WANT_READ:
return 0 return 0
elif get_errno(x) == SSL_ERROR_WANT_WRITE: elif get_errno(e) == SSL_ERROR_WANT_WRITE:
return 0 return 0
else: else:
raise raise
@@ -155,7 +156,7 @@ class GreenSSLSocket(__ssl.SSLSocket):
except orig_socket.error, e: except orig_socket.error, e:
if self.act_non_blocking: if self.act_non_blocking:
raise raise
if ge_errno(e) == errno.EWOULDBLOCK: if get_errno(e) == errno.EWOULDBLOCK:
trampoline(self.fileno(), write=True, trampoline(self.fileno(), write=True,
timeout=self.gettimeout(), timeout_exc=timeout_exc('timed out')) timeout=self.gettimeout(), timeout_exc=timeout_exc('timed out'))
if get_errno(e) in SOCKET_CLOSED: if get_errno(e) in SOCKET_CLOSED:

View File

@@ -1,3 +1,4 @@
from eventlet.common import get_errno
from eventlet.hubs import trampoline from eventlet.hubs import trampoline
BUFFER_SIZE = 4096 BUFFER_SIZE = 4096
@@ -22,19 +23,6 @@ except AttributeError:
def _fileobject(sock, *args, **kwargs): def _fileobject(sock, *args, **kwargs):
return _original_socket.makefile(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): def socket_connect(descriptor, address):
""" """
Attempts to connect to the address, returns the descriptor if it succeeds, Attempts to connect to the address, returns the descriptor if it succeeds,

View File

@@ -5,6 +5,7 @@ select = patcher.original('select')
time = patcher.original('time') time = patcher.original('time')
sleep = time.sleep sleep = time.sleep
from eventlet.common import get_errno
from eventlet.hubs.hub import BaseHub, READ, WRITE from eventlet.hubs.hub import BaseHub, READ, WRITE
EXC_MASK = select.POLLERR | select.POLLHUP EXC_MASK = select.POLLERR | select.POLLHUP
@@ -78,7 +79,7 @@ class Hub(BaseHub):
try: try:
presult = self.poll.poll(seconds * self.WAIT_MULTIPLIER) presult = self.poll.poll(seconds * self.WAIT_MULTIPLIER)
except select.error, e: except select.error, e:
if e.args[0] == errno.EINTR: if get_errno(e) == errno.EINTR:
return return
raise raise
SYSTEM_EXCEPTIONS = self.SYSTEM_EXCEPTIONS SYSTEM_EXCEPTIONS = self.SYSTEM_EXCEPTIONS

View File

@@ -1,6 +1,7 @@
import sys import sys
import errno import errno
from eventlet import patcher from eventlet import patcher
from eventlet.common import get_errno
select = patcher.original('select') select = patcher.original('select')
time = patcher.original('time') time = patcher.original('time')
@@ -20,7 +21,7 @@ class Hub(BaseHub):
try: try:
select.select([fd], [], [], 0) select.select([fd], [], [], 0)
except select.error, e: except select.error, e:
if e.args[0] == errno.EBADF: if get_errno(e) == errno.EBADF:
self.remove_descriptor(fd) self.remove_descriptor(fd)
def wait(self, seconds=None): def wait(self, seconds=None):
@@ -33,9 +34,9 @@ class Hub(BaseHub):
try: try:
r, w, er = select.select(readers.keys(), writers.keys(), readers.keys() + writers.keys(), seconds) r, w, er = select.select(readers.keys(), writers.keys(), readers.keys() + writers.keys(), seconds)
except select.error, e: except select.error, e:
if e.args[0] == errno.EINTR: if get_errno(e) == errno.EINTR:
return return
elif e.args[0] in BAD_SOCK: elif get_errno(e) in BAD_SOCK:
self._remove_bad_fds() self._remove_bad_fds()
return return
else: else:
@@ -57,4 +58,4 @@ class Hub(BaseHub):
raise raise
except: except:
self.squelch_exception(fileno, sys.exc_info()) self.squelch_exception(fileno, sys.exc_info())
sys.exc_clear() sys.exc_clear()

View File

@@ -10,7 +10,7 @@ from eventlet.green import socket
from eventlet.green import BaseHTTPServer from eventlet.green import BaseHTTPServer
from eventlet import greenpool from eventlet import greenpool
from eventlet import greenio from eventlet import greenio
from eventlet.greenio import get_errno from eventlet.common import get_errno
DEFAULT_MAX_SIMULTANEOUS_REQUESTS = 1024 DEFAULT_MAX_SIMULTANEOUS_REQUESTS = 1024
DEFAULT_MAX_HTTP_VERSION = 'HTTP/1.1' DEFAULT_MAX_HTTP_VERSION = 'HTTP/1.1'

View File

@@ -3,6 +3,7 @@ import errno
from eventlet import wsgi from eventlet import wsgi
from eventlet import pools from eventlet import pools
import eventlet import eventlet
from eventlet.common import get_errno
class WebSocketWSGI(object): class WebSocketWSGI(object):
def __init__(self, handler, origin): def __init__(self, handler, origin):
@@ -37,7 +38,7 @@ class WebSocketWSGI(object):
try: try:
self.handler(ws) self.handler(ws)
except socket.error, e: except socket.error, e:
if wsgi.get_errno(e) != errno.EPIPE: if get_errno(e) != errno.EPIPE:
raise raise
# use this undocumented feature of eventlet.wsgi to ensure that it # use this undocumented feature of eventlet.wsgi to ensure that it
# doesn't barf on the fact that we didn't call start_response # 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__": if __name__ == "__main__":
# run an example app from the command line # run an example app from the command line
listener = eventlet.listen(('localhost', 7000)) listener = eventlet.listen(('localhost', 7000))
wsgi.server(listener, dispatch) wsgi.server(listener, dispatch)

View File

@@ -3,6 +3,7 @@ from tests import LimitedTestCase, skip_with_pyevent, main, skipped
from eventlet import event from eventlet import event
from eventlet import greenio from eventlet import greenio
from eventlet import debug from eventlet import debug
from eventlet.common import get_errno
from eventlet.green import socket from eventlet.green import socket
from eventlet.green import time from eventlet.green import time
from eventlet.green.socket import GreenSSLObject from eventlet.green.socket import GreenSSLObject

View File

@@ -379,7 +379,7 @@ class Stress(tests.LimitedTestCase):
try: try:
i = it.next() i = it.next()
except StressException, exc: except StressException, exc:
i = exc[0] i = exc.args[0]
except StopIteration: except StopIteration:
break break
received += 1 received += 1

View File

@@ -14,6 +14,7 @@ from eventlet import greenio
from eventlet.green import socket as greensocket from eventlet.green import socket as greensocket
from eventlet import wsgi from eventlet import wsgi
from eventlet import processes from eventlet import processes
from eventlet.common import get_errno
from tests import find_command from tests import find_command
@@ -95,7 +96,7 @@ def read_http(sock):
try: try:
response_line = fd.readline() response_line = fd.readline()
except socket.error, exc: except socket.error, exc:
if exc[0] == 10053: if get_errno(exc) == 10053:
raise ConnectionClosed raise ConnectionClosed
raise raise
if not response_line: if not response_line:
@@ -563,7 +564,7 @@ class TestHttpd(LimitedTestCase):
server_sock_2.accept() server_sock_2.accept()
# shouldn't be able to use this one anymore # shouldn't be able to use this one anymore
except socket.error, exc: except socket.error, exc:
self.assertEqual(exc[0], errno.EBADF) self.assertEqual(get_errno(exc), errno.EBADF)
self.spawn_server(sock=server_sock) self.spawn_server(sock=server_sock)
sock = eventlet.connect(('localhost', self.port)) sock = eventlet.connect(('localhost', self.port))
fd = sock.makefile() fd = sock.makefile()
@@ -680,7 +681,7 @@ class TestHttpd(LimitedTestCase):
eventlet.connect(('localhost', self.port)) eventlet.connect(('localhost', self.port))
self.fail("Didn't expect to connect") self.fail("Didn't expect to connect")
except socket.error, exc: 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.assert_('Invalid argument' in self.logfile.getvalue(),
self.logfile.getvalue()) self.logfile.getvalue())