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:
@@ -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
19
eventlet/common.py
Normal 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
|
||||||
|
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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):
|
||||||
|
@@ -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:
|
||||||
|
@@ -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,
|
||||||
|
@@ -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
|
||||||
|
@@ -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()
|
||||||
|
@@ -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'
|
||||||
|
@@ -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)
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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())
|
||||||
|
Reference in New Issue
Block a user