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
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()

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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