From 53a59d9370fc8e7155da4a7c04ad0c15f6c0750a Mon Sep 17 00:00:00 2001
From: amajorek
Date: Fri, 26 Feb 2010 09:58:07 -0500
Subject: [PATCH 1/6] first draft of making eventlet py3k compatible. -
__import__ used to import system modules in places where local module with
the same name exist. - GreenSocket.timeout private member renamed to
_timeout. It is R/O property in 3.x socket.socket object. - Calls to
GreensSocket.timeout changed to call gettimeout to isolate clients from
GreenSocket internals. - GreenSocket access to unknown attributes will be
forwarded to fd member. i.e. py3k has _io_refs property not needed in 2.x
version - get_errno moved to eventlet/greenio.py to be accessible to every
place where testing socket.error.errno is needed - Modified tests to use
makefile with mode='w' where data was written. 3.x does not allow to write to
file opened for reading. - socket._fileobject class does not exist in 3.x. It
will be emulated with _fileobject function. Also moved definition from
eventlet.green.socket to eventlet.grreenio.
---
eventlet/green/OpenSSL/SSL.py | 18 ++++++-------
eventlet/green/os.py | 4 +--
eventlet/green/socket.py | 5 ++--
eventlet/green/ssl.py | 13 +++++----
eventlet/greenio.py | 51 ++++++++++++++++++++++++++---------
eventlet/hubs/hub.py | 9 ++++++-
eventlet/tpool.py | 2 +-
eventlet/wsgi.py | 10 +------
tests/api_test.py | 2 +-
9 files changed, 69 insertions(+), 45 deletions(-)
diff --git a/eventlet/green/OpenSSL/SSL.py b/eventlet/green/OpenSSL/SSL.py
index d0a0b42..8e2fe80 100644
--- a/eventlet/green/OpenSSL/SSL.py
+++ b/eventlet/green/OpenSSL/SSL.py
@@ -32,12 +32,12 @@ class GreenConnection(greenio.GreenSocket):
except WantReadError:
trampoline(self.fd.fileno(),
read=True,
- timeout=self.timeout,
+ timeout=self.gettimeout(),
timeout_exc=socket.timeout)
except WantWriteError:
trampoline(self.fd.fileno(),
write=True,
- timeout=self.timeout,
+ timeout=self.gettimeout(),
timeout_exc=socket.timeout)
def dup(self):
@@ -81,12 +81,12 @@ class GreenConnection(greenio.GreenSocket):
except WantReadError:
trampoline(self.fd.fileno(),
read=True,
- timeout=self.timeout,
+ timeout=self.gettimeout(),
timeout_exc=socket.timeout)
except WantWriteError:
trampoline(self.fd.fileno(),
write=True,
- timeout=self.timeout,
+ timeout=self.gettimeout(),
timeout_exc=socket.timeout)
except SysCallError, e:
if e[0] == -1 or e[0] > 0:
@@ -111,12 +111,12 @@ class GreenConnection(greenio.GreenSocket):
except WantReadError:
trampoline(self.fd.fileno(),
read=True,
- timeout=self.timeout,
+ timeout=self.gettimeout(),
timeout_exc=socket.timeout)
except WantWriteError:
trampoline(self.fd.fileno(),
write=True,
- timeout=self.timeout,
+ timeout=self.gettimeout(),
timeout_exc=socket.timeout)
send = write
@@ -148,12 +148,12 @@ class GreenConnection(greenio.GreenSocket):
except WantReadError:
trampoline(self.fd.fileno(),
read=True,
- timeout=self.timeout,
+ timeout=self.gettimeout(),
timeout_exc=socket.timeout)
except WantWriteError:
trampoline(self.fd.fileno(),
write=True,
- timeout=self.timeout,
+ timeout=self.gettimeout(),
timeout_exc=socket.timeout)
@@ -183,4 +183,4 @@ class GreenConnection(greenio.GreenSocket):
Connection = ConnectionType = GreenConnection
-del greenio
\ No newline at end of file
+del greenio
diff --git a/eventlet/green/os.py b/eventlet/green/os.py
index e8fe292..952c5ae 100644
--- a/eventlet/green/os.py
+++ b/eventlet/green/os.py
@@ -1,6 +1,6 @@
os_orig = __import__("os")
import errno
-import socket
+socket = __import__("socket")
from eventlet import greenio
from eventlet import greenthread
@@ -74,4 +74,4 @@ def waitpid(pid, options):
return rpid, status
greenthread.sleep(0.01)
-# TODO: open
\ No newline at end of file
+# TODO: open
diff --git a/eventlet/green/socket.py b/eventlet/green/socket.py
index 4af8f05..01c5f7a 100644
--- a/eventlet/green/socket.py
+++ b/eventlet/green/socket.py
@@ -1,13 +1,14 @@
__socket = __import__('socket')
for var in __socket.__all__:
exec "%s = __socket.%s" % (var, var)
-_fileobject = __socket._fileobject
from eventlet.hubs import get_hub
from eventlet.greenio import GreenSocket as socket
from eventlet.greenio import SSL as _SSL # for exceptions
from eventlet.greenio import _GLOBAL_DEFAULT_TIMEOUT
-import os
+from eventlet.greenio import _fileobject
+
+os = __import__('os')
import sys
import warnings
diff --git a/eventlet/green/ssl.py b/eventlet/green/ssl.py
index 9c15541..23bcadc 100644
--- a/eventlet/green/ssl.py
+++ b/eventlet/green/ssl.py
@@ -4,10 +4,9 @@ for attr in dir(__ssl):
exec "%s = __ssl.%s" % (attr, attr)
import errno
-import time
+time = __import__('time')
from eventlet.hubs import trampoline
-from thread import get_ident
from eventlet.greenio import set_nonblocking, GreenSocket, SOCKET_CLOSED, CONNECT_ERR, CONNECT_SUCCESS
orig_socket = __import__('socket')
socket = orig_socket.socket
@@ -36,7 +35,7 @@ class GreenSSLSocket(__ssl.SSLSocket):
sock = GreenSocket(sock)
self.act_non_blocking = sock.act_non_blocking
- self.timeout = sock.timeout
+ self._timeout = sock.gettimeout()
super(GreenSSLSocket, self).__init__(sock.fd, *args, **kw)
del sock
@@ -49,18 +48,18 @@ class GreenSSLSocket(__ssl.SSLSocket):
self.recvfrom_into = lambda buffer, nbytes=None, flags=0: GreenSSLSocket.recvfrom_into(self, buffer, nbytes, flags)
def settimeout(self, timeout):
- self.timeout = timeout
+ self._timeout = timeout
def gettimeout(self):
- return self.timeout
+ return self._timeout
def setblocking(self, flag):
if flag:
self.act_non_blocking = False
- self.timeout = None
+ self._timeout = None
else:
self.act_non_blocking = True
- self.timeout = 0.0
+ self._timeout = 0.0
def _call_trampolining(self, func, *a, **kw):
if self.act_non_blocking:
diff --git a/eventlet/greenio.py b/eventlet/greenio.py
index b95ab39..f750a32 100644
--- a/eventlet/greenio.py
+++ b/eventlet/greenio.py
@@ -20,6 +20,27 @@ __all__ = ['GreenSocket', 'GreenPipe', 'shutdown_safe']
CONNECT_ERR = set((errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK))
CONNECT_SUCCESS = set((0, errno.EISCONN))
+# Emulate _fileobject class in 3.x implementation
+# Eventually this internal socket structure could be replaced with makefile calls.
+try:
+ _fileobject = socket._fileobject
+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.errno
+ except AttributeError:
+ try:
+ return exc[0]
+ except (TypeError,IndexError):
+ return None
+
def socket_connect(descriptor, address):
"""
Attempts to connect to the address, returns the descriptor if it succeeds,
@@ -42,7 +63,7 @@ def socket_accept(descriptor):
try:
return descriptor.accept()
except socket.error, e:
- if e[0] == errno.EWOULDBLOCK:
+ if get_errno(e) == errno.EWOULDBLOCK:
return None
raise
@@ -102,7 +123,6 @@ class GreenSocket(object):
Green version of socket.socket class, that is intended to be 100%
API-compatible.
"""
- timeout = None
def __init__(self, family_or_realsock=socket.AF_INET, *args, **kwargs):
if isinstance(family_or_realsock, (int, long)):
fd = _original_socket(family_or_realsock, *args, **kwargs)
@@ -113,9 +133,9 @@ class GreenSocket(object):
# import timeout from other socket, if it was there
try:
- self.timeout = fd.gettimeout() or socket.getdefaulttimeout()
+ self._timeout = fd.gettimeout() or socket.getdefaulttimeout()
except AttributeError:
- self.timeout = socket.getdefaulttimeout()
+ self._timeout = socket.getdefaulttimeout()
set_nonblocking(fd)
self.fd = fd
@@ -140,6 +160,11 @@ class GreenSocket(object):
def proto(self):
return self.fd.proto
+ #forward unknown requests to fd
+ #i.e _io_refs and _decref_socketios in 3.x
+ def __getattr__(self, value):
+ return getattr(self.fd, value)
+
def accept(self):
if self.act_non_blocking:
return self.fd.accept()
@@ -206,7 +231,7 @@ class GreenSocket(object):
sock = self.fd.dup(*args, **kw)
set_nonblocking(sock)
newsock = type(self)(sock)
- newsock.settimeout(self.timeout)
+ newsock.settimeout(self.gettimeout())
return newsock
def fileno(self, *args, **kw):
@@ -229,8 +254,8 @@ class GreenSocket(object):
fn = self.listen = self.fd.listen
return fn(*args, **kw)
- def makefile(self, mode='r', bufsize=-1):
- return socket._fileobject(self.dup(), mode, bufsize)
+ def makefile(self, *args, **kw):
+ return _fileobject(self.dup(), *args, **kw)
def makeGreenFile(self, mode='r', bufsize=-1):
warnings.warn("makeGreenFile has been deprecated, please use "
@@ -253,7 +278,7 @@ class GreenSocket(object):
raise
trampoline(fd,
read=True,
- timeout=self.timeout,
+ timeout=self.gettimeout(),
timeout_exc=socket.timeout)
def recvfrom(self, *args):
@@ -289,7 +314,7 @@ class GreenSocket(object):
while tail < len_data:
trampoline(fd,
write=True,
- timeout=self.timeout,
+ timeout=self.gettimeout(),
timeout_exc=socket.timeout)
tail += self.send(data[tail:], flags)
@@ -300,10 +325,10 @@ class GreenSocket(object):
def setblocking(self, flag):
if flag:
self.act_non_blocking = False
- self.timeout = None
+ self._timeout = None
else:
self.act_non_blocking = True
- self.timeout = 0.0
+ self._timeout = 0.0
def setsockopt(self, *args, **kw):
fn = self.setsockopt = self.fd.setsockopt
@@ -327,10 +352,10 @@ class GreenSocket(object):
if howlong == 0.0:
self.setblocking(howlong)
else:
- self.timeout = howlong
+ self._timeout = howlong
def gettimeout(self):
- return self.timeout
+ return self._timeout
class GreenPipe(object):
diff --git a/eventlet/hubs/hub.py b/eventlet/hubs/hub.py
index c5e885e..b6f7489 100644
--- a/eventlet/hubs/hub.py
+++ b/eventlet/hubs/hub.py
@@ -7,6 +7,13 @@ from eventlet.hubs import timer
from eventlet import patcher
time = patcher.original('time')
+# In py3k exception information is not visible outside of except statements
+# so sys.exc_clear become obsolete and removed.
+try:
+ sys_exc_clear = sys.exc_clear
+except AttributeError:
+ sys_exc_clear = lambda: None
+
READ="read"
WRITE="write"
@@ -110,7 +117,7 @@ class BaseHub(object):
current.parent = self.greenlet
except ValueError:
pass # gets raised if there is a greenlet parent cycle
- sys.exc_clear()
+ sys_exc_clear()
return self.greenlet.switch()
def squelch_exception(self, fileno, exc_info):
diff --git a/eventlet/tpool.py b/eventlet/tpool.py
index b36fc7c..df7d2c3 100644
--- a/eventlet/tpool.py
+++ b/eventlet/tpool.py
@@ -226,7 +226,7 @@ def setup():
csock = util.__original_socket__(socket.AF_INET, socket.SOCK_STREAM)
csock.connect(('localhost', sock.getsockname()[1]))
nsock, addr = sock.accept()
- _rfile = greenio.Green_fileobject(greenio.GreenSocket(csock))
+ _rfile = greenio.GreenSocket(csock).makefile()
_wfile = nsock.makefile()
_reqq = Queue(maxsize=-1)
diff --git a/eventlet/wsgi.py b/eventlet/wsgi.py
index 1eebd7e..133a446 100644
--- a/eventlet/wsgi.py
+++ b/eventlet/wsgi.py
@@ -10,6 +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
DEFAULT_MAX_SIMULTANEOUS_REQUESTS = 1024
DEFAULT_MAX_HTTP_VERSION = 'HTTP/1.1'
@@ -40,15 +41,6 @@ BROKEN_SOCK = set((errno.EPIPE, errno.ECONNRESET))
# special flag return value for apps
ALREADY_HANDLED = object()
-def get_errno(err):
- """ Simple method to get the error code out of socket.error objects. It
- compensates for some cases where the code is not in the expected
- location."""
- try:
- return err[0]
- except IndexError:
- return None
-
class Input(object):
def __init__(self,
rfile,
diff --git a/tests/api_test.py b/tests/api_test.py
index ceb747f..abc84c9 100644
--- a/tests/api_test.py
+++ b/tests/api_test.py
@@ -39,7 +39,7 @@ class TestApi(TestCase):
def accept_once(listenfd):
try:
conn, addr = listenfd.accept()
- fd = conn.makefile()
+ fd = conn.makefile(mode='w')
conn.close()
fd.write('hello\n')
fd.close()
From ff18a2e01c78c98211c692848d733c6222aa682f Mon Sep 17 00:00:00 2001
From: Ryan Williams
Date: Fri, 26 Feb 2010 16:47:22 -0800
Subject: [PATCH 2/6] 0.9.6 branding
---
AUTHORS | 1 +
doc/real_index.html | 2 +-
eventlet/__init__.py | 2 +-
3 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/AUTHORS b/AUTHORS
index 1b6d574..f921e4e 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -13,6 +13,7 @@ Contributors
* Patrick Carlisle
* Brantley Harris
* Gregory Holt
+* Joe Malicki
* Chet Murthy
* Eugene Oden
* radix
diff --git a/doc/real_index.html b/doc/real_index.html
index 3be82f5..fad3ad0 100644
--- a/doc/real_index.html
+++ b/doc/real_index.html
@@ -41,7 +41,7 @@ easy_install eventlet
Alternately, you can download the source tarball:
diff --git a/eventlet/__init__.py b/eventlet/__init__.py
index e82a15a..b70405e 100644
--- a/eventlet/__init__.py
+++ b/eventlet/__init__.py
@@ -1,4 +1,4 @@
-version_info = (0, 9, 6, "dev1")
+version_info = (0, 9, 6)
__version__ = ".".join(map(str, version_info))
try:
From 15aa8eadd3caf91b4b1f6fb9294232609829b5c5 Mon Sep 17 00:00:00 2001
From: amajorek
Date: Sat, 27 Feb 2010 16:31:00 -0500
Subject: [PATCH 4/6] py3k - extracting errno from exception wrapped into
get_errno function to work under 3.x python.
Exceptions do not have __getitem__ implemented. e.args[0] still works.
---
eventlet/green/os.py | 9 +++++----
eventlet/green/profile.py | 4 ++--
eventlet/green/ssl.py | 32 ++++++++++++++++----------------
eventlet/greenio.py | 28 ++++++++++++++--------------
tests/greenio_test.py | 2 +-
5 files changed, 38 insertions(+), 37 deletions(-)
diff --git a/eventlet/green/os.py b/eventlet/green/os.py
index 952c5ae..83e81b5 100644
--- a/eventlet/green/os.py
+++ b/eventlet/green/os.py
@@ -3,6 +3,7 @@ import errno
socket = __import__("socket")
from eventlet import greenio
+from eventlet.greenio import get_errno
from eventlet import greenthread
from eventlet import hubs
@@ -27,10 +28,10 @@ def read(fd, n):
try:
return __original_read__(fd, n)
except (OSError, IOError), e:
- if e[0] != errno.EAGAIN:
+ if get_errno(e) != errno.EAGAIN:
raise
except socket.error, e:
- if e[0] == errno.EPIPE:
+ if get_errno(e) == errno.EPIPE:
return ''
raise
hubs.trampoline(fd, read=True)
@@ -45,10 +46,10 @@ def write(fd, st):
try:
return __original_write__(fd, st)
except (OSError, IOError), e:
- if e[0] != errno.EAGAIN:
+ if get_errno(e) != errno.EAGAIN:
raise
except socket.error, e:
- if e[0] != errno.EPIPE:
+ if get_errno(e) != errno.EPIPE:
raise
hubs.trampoline(fd, write=True)
diff --git a/eventlet/green/profile.py b/eventlet/green/profile.py
index 5c000da..5759d75 100644
--- a/eventlet/green/profile.py
+++ b/eventlet/green/profile.py
@@ -25,6 +25,7 @@
"""This module is API-equivalent to the standard library :mod:`profile` module but it is greenthread-aware as well as thread-aware. Use this module
to profile Eventlet-based applications in preference to either :mod:`profile` or :mod:`cProfile`.
+FIXME: No testcases for this module.
"""
profile_orig = __import__('profile')
@@ -34,9 +35,8 @@ for var in profile_orig.__all__:
import new
import sys
-import time
import traceback
-import thread
+thread = __import__('thread') # Original module needed. 2to3 translated import thread as from . import thread
import functools
from eventlet import greenthread
diff --git a/eventlet/green/ssl.py b/eventlet/green/ssl.py
index 23bcadc..a4c6140 100644
--- a/eventlet/green/ssl.py
+++ b/eventlet/green/ssl.py
@@ -7,7 +7,7 @@ import errno
time = __import__('time')
from eventlet.hubs import trampoline
-from eventlet.greenio import set_nonblocking, GreenSocket, SOCKET_CLOSED, CONNECT_ERR, CONNECT_SUCCESS
+from eventlet.greenio import set_nonblocking, GreenSocket, SOCKET_CLOSED, CONNECT_ERR, CONNECT_SUCCESS, get_errno
orig_socket = __import__('socket')
socket = orig_socket.socket
timeout_exc = orig_socket.timeout
@@ -69,12 +69,12 @@ class GreenSSLSocket(__ssl.SSLSocket):
try:
return func(*a, **kw)
except SSLError, exc:
- if exc[0] == SSL_ERROR_WANT_READ:
+ if get_errno(exc) == SSL_ERROR_WANT_READ:
trampoline(self.fileno(),
read=True,
timeout=self.gettimeout(),
timeout_exc=timeout_exc('timed out'))
- elif exc[0] == SSL_ERROR_WANT_WRITE:
+ elif get_errno(exc) == SSL_ERROR_WANT_WRITE:
trampoline(self.fileno(),
write=True,
timeout=self.gettimeout(),
@@ -106,9 +106,9 @@ class GreenSSLSocket(__ssl.SSLSocket):
try:
v = self._sslobj.write(data)
except SSLError, x:
- if x.args[0] == SSL_ERROR_WANT_READ:
+ if get_errno(x) == SSL_ERROR_WANT_READ:
return 0
- elif x.args[0] == SSL_ERROR_WANT_WRITE:
+ elif get_errno(x) == SSL_ERROR_WANT_WRITE:
return 0
else:
raise
@@ -121,8 +121,8 @@ class GreenSSLSocket(__ssl.SSLSocket):
except orig_socket.error, e:
if self.act_non_blocking:
raise
- if e[0] == errno.EWOULDBLOCK or \
- e[0] == errno.ENOTCONN:
+ if get_errno(e) == errno.EWOULDBLOCK or \
+ get_errno(e) == errno.ENOTCONN:
return 0
raise
@@ -155,10 +155,10 @@ class GreenSSLSocket(__ssl.SSLSocket):
except orig_socket.error, e:
if self.act_non_blocking:
raise
- if e[0] == errno.EWOULDBLOCK:
+ if ge_errno(e) == errno.EWOULDBLOCK:
trampoline(self.fileno(), write=True,
timeout=self.gettimeout(), timeout_exc=timeout_exc('timed out'))
- if e[0] in SOCKET_CLOSED:
+ if get_errno(e) in SOCKET_CLOSED:
return ''
raise
@@ -178,10 +178,10 @@ class GreenSSLSocket(__ssl.SSLSocket):
except orig_socket.error, e:
if self.act_non_blocking:
raise
- if e[0] == errno.EWOULDBLOCK:
+ if get_errno(e) == errno.EWOULDBLOCK:
trampoline(self.fileno(), read=True,
timeout=self.gettimeout(), timeout_exc=timeout_exc('timed out'))
- if e[0] in SOCKET_CLOSED:
+ if get_errno(e) in SOCKET_CLOSED:
return ''
raise
@@ -221,9 +221,9 @@ class GreenSSLSocket(__ssl.SSLSocket):
try:
return real_connect(self, addr)
except orig_socket.error, exc:
- if exc[0] in CONNECT_ERR:
+ if get_errno(exc) in CONNECT_ERR:
trampoline(self.fileno(), write=True)
- elif exc[0] in CONNECT_SUCCESS:
+ elif get_errno(exc) in CONNECT_SUCCESS:
return
else:
raise
@@ -233,10 +233,10 @@ class GreenSSLSocket(__ssl.SSLSocket):
try:
real_connect(self, addr)
except orig_socket.error, exc:
- if exc[0] in CONNECT_ERR:
+ if get_errno(exc) in CONNECT_ERR:
trampoline(self.fileno(), write=True,
timeout=end-time.time(), timeout_exc=timeout_exc('timed out'))
- elif exc[0] in CONNECT_SUCCESS:
+ elif get_errno(exc) in CONNECT_SUCCESS:
return
else:
raise
@@ -272,7 +272,7 @@ class GreenSSLSocket(__ssl.SSLSocket):
set_nonblocking(newsock)
break
except orig_socket.error, e:
- if e[0] != errno.EWOULDBLOCK:
+ if get_errno(e) != errno.EWOULDBLOCK:
raise
trampoline(self.fileno(), read=True, timeout=self.gettimeout(),
timeout_exc=timeout_exc('timed out'))
diff --git a/eventlet/greenio.py b/eventlet/greenio.py
index e069a03..f5dfb7f 100644
--- a/eventlet/greenio.py
+++ b/eventlet/greenio.py
@@ -28,11 +28,11 @@ def get_errno(exc):
socket.error in 3.x does not allow indexing access
"""
try:
- return exc.errno
- except AttributeError:
+ return exc.args[0]
+ except (TypeError,IndexError):
try:
- return exc[0]
- except (TypeError,IndexError):
+ return exc.errno
+ except AttributeError:
return None
def socket_connect(descriptor, address):
@@ -209,7 +209,7 @@ class GreenSocket(object):
try:
trampoline(fd, write=True)
except socket.error, ex:
- return ex[0]
+ return get_errno(ex)
else:
end = time.time() + self.gettimeout()
while True:
@@ -221,7 +221,7 @@ class GreenSocket(object):
trampoline(fd, write=True, timeout=end-time.time(),
timeout_exc=socket.timeout(errno.EAGAIN))
except socket.error, ex:
- return ex[0]
+ return get_errno(ex)
def dup(self, *args, **kw):
sock = self.fd.dup(*args, **kw)
@@ -266,9 +266,9 @@ class GreenSocket(object):
try:
return fd.recv(buflen, flags)
except socket.error, e:
- if e[0] in SOCKET_BLOCKING:
+ if get_errno(e) in SOCKET_BLOCKING:
pass
- elif e[0] in SOCKET_CLOSED:
+ elif get_errno(e) in SOCKET_CLOSED:
return ''
else:
raise
@@ -308,7 +308,7 @@ class GreenSocket(object):
try:
total_sent += fd.send(data[total_sent:], flags)
except socket.error, e:
- if e[0] not in SOCKET_BLOCKING:
+ if get_errno(e) not in SOCKET_BLOCKING:
raise
if total_sent == len_data:
@@ -392,10 +392,10 @@ class GreenPipe(object):
try:
return fd.read(buflen)
except IOError, e:
- if e[0] != errno.EAGAIN:
+ if get_errno(e) != errno.EAGAIN:
return ''
except socket.error, e:
- if e[0] == errno.EPIPE:
+ if get_errno(e) == errno.EPIPE:
return ''
raise
trampoline(fd, read=True)
@@ -424,13 +424,13 @@ class GreenPipe(object):
fd.flush()
return len(data)
except IOError, e:
- if e[0] != errno.EAGAIN:
+ if get_errno(e) != errno.EAGAIN:
raise
except ValueError, e:
# what's this for?
pass
except socket.error, e:
- if e[0] != errno.EPIPE:
+ if get_errno(e) != errno.EPIPE:
raise
trampoline(fd, write=True)
@@ -531,7 +531,7 @@ def shutdown_safe(sock):
except socket.error, e:
# we don't care if the socket is already closed;
# this will often be the case in an http server context
- if e[0] != errno.ENOTCONN:
+ if get_errno(e) != errno.ENOTCONN:
raise
diff --git a/tests/greenio_test.py b/tests/greenio_test.py
index 7afda9c..8a3e019 100644
--- a/tests/greenio_test.py
+++ b/tests/greenio_test.py
@@ -41,7 +41,7 @@ class TestGreenIo(LimitedTestCase):
self.assertEqual(e.args[0], 'timed out')
except socket.error, e:
# unreachable is also a valid outcome
- if not e[0] in (errno.EHOSTUNREACH, errno.ENETUNREACH):
+ if not get_errno(e) in (errno.EHOSTUNREACH, errno.ENETUNREACH):
raise
def test_accept_timeout(self):
From cac3d24f2fdc47d96829a4d9a86b999e2cc968b3 Mon Sep 17 00:00:00 2001
From: Ryan Williams
Date: Sat, 27 Feb 2010 17:59:50 -0800
Subject: [PATCH 5/6] Conditional import of attributes.
---
eventlet/green/socket.py | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/eventlet/green/socket.py b/eventlet/green/socket.py
index aeadc0d..eaba5ba 100644
--- a/eventlet/green/socket.py
+++ b/eventlet/green/socket.py
@@ -14,14 +14,20 @@ import warnings
__patched__ = ['fromfd', 'socketpair', 'gethostbyname', 'create_connection',
'ssl', 'socket']
-__original_fromfd__ = __socket.fromfd
-def fromfd(*args):
- return socket(__original_fromfd__(*args))
+try:
+ __original_fromfd__ = __socket.fromfd
+ def fromfd(*args):
+ return socket(__original_fromfd__(*args))
+except AttributeError:
+ pass
-__original_socketpair__ = __socket.socketpair
-def socketpair(*args):
- one, two = __original_socketpair__(*args)
- return socket(one), socket(two)
+try:
+ __original_socketpair__ = __socket.socketpair
+ def socketpair(*args):
+ one, two = __original_socketpair__(*args)
+ return socket(one), socket(two)
+except AttributeError:
+ pass
__original_gethostbyname__ = __socket.gethostbyname
def gethostbyname(name):
From 44b615c8d3a672890c9d930e553a6eedc6b04d5a Mon Sep 17 00:00:00 2001
From: Ryan Williams
Date: Sat, 27 Feb 2010 19:09:55 -0800
Subject: [PATCH 6/6] amajorek's commit reminded me that we need the
non-monkeypatched thread module here.
---
eventlet/green/profile.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/eventlet/green/profile.py b/eventlet/green/profile.py
index 5759d75..7f8fb6b 100644
--- a/eventlet/green/profile.py
+++ b/eventlet/green/profile.py
@@ -36,10 +36,11 @@ for var in profile_orig.__all__:
import new
import sys
import traceback
-thread = __import__('thread') # Original module needed. 2to3 translated import thread as from . import thread
import functools
from eventlet import greenthread
+from eventlet import patcher
+thread = patcher.original('thread') # non-monkeypatched module needed
#This class provides the start() and stop() functions
class Profile(profile_orig.Profile):