This commit is contained in:
Ryan Williams
2010-02-28 04:44:29 -08:00
14 changed files with 122 additions and 89 deletions

View File

@@ -13,6 +13,7 @@ Contributors
* Patrick Carlisle * Patrick Carlisle
* Brantley Harris * Brantley Harris
* Gregory Holt * Gregory Holt
* Joe Malicki
* Chet Murthy * Chet Murthy
* Eugene Oden * Eugene Oden
* radix * radix

View File

@@ -41,7 +41,7 @@ easy_install eventlet
<p>Alternately, you can download the source tarball: <p>Alternately, you can download the source tarball:
<ul> <ul>
<li><a href="http://pypi.python.org/packages/source/e/eventlet/eventlet-0.9.5.tar.gz">eventlet-0.9.5.tar.gz</a></li> <li><a href="http://pypi.python.org/packages/source/e/eventlet/eventlet-0.9.6.tar.gz">eventlet-0.9.6.tar.gz</a></li>
</ul> </ul>
</p> </p>

View File

@@ -1,4 +1,4 @@
version_info = (0, 9, 6, "dev1") version_info = (0, 9, 6)
__version__ = ".".join(map(str, version_info)) __version__ = ".".join(map(str, version_info))
try: try:

View File

@@ -32,12 +32,12 @@ class GreenConnection(greenio.GreenSocket):
except WantReadError: except WantReadError:
trampoline(self.fd.fileno(), trampoline(self.fd.fileno(),
read=True, read=True,
timeout=self.timeout, timeout=self.gettimeout(),
timeout_exc=socket.timeout) timeout_exc=socket.timeout)
except WantWriteError: except WantWriteError:
trampoline(self.fd.fileno(), trampoline(self.fd.fileno(),
write=True, write=True,
timeout=self.timeout, timeout=self.gettimeout(),
timeout_exc=socket.timeout) timeout_exc=socket.timeout)
def dup(self): def dup(self):
@@ -81,12 +81,12 @@ class GreenConnection(greenio.GreenSocket):
except WantReadError: except WantReadError:
trampoline(self.fd.fileno(), trampoline(self.fd.fileno(),
read=True, read=True,
timeout=self.timeout, timeout=self.gettimeout(),
timeout_exc=socket.timeout) timeout_exc=socket.timeout)
except WantWriteError: except WantWriteError:
trampoline(self.fd.fileno(), trampoline(self.fd.fileno(),
write=True, write=True,
timeout=self.timeout, 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 e[0] == -1 or e[0] > 0:
@@ -111,12 +111,12 @@ class GreenConnection(greenio.GreenSocket):
except WantReadError: except WantReadError:
trampoline(self.fd.fileno(), trampoline(self.fd.fileno(),
read=True, read=True,
timeout=self.timeout, timeout=self.gettimeout(),
timeout_exc=socket.timeout) timeout_exc=socket.timeout)
except WantWriteError: except WantWriteError:
trampoline(self.fd.fileno(), trampoline(self.fd.fileno(),
write=True, write=True,
timeout=self.timeout, timeout=self.gettimeout(),
timeout_exc=socket.timeout) timeout_exc=socket.timeout)
send = write send = write
@@ -148,12 +148,12 @@ class GreenConnection(greenio.GreenSocket):
except WantReadError: except WantReadError:
trampoline(self.fd.fileno(), trampoline(self.fd.fileno(),
read=True, read=True,
timeout=self.timeout, timeout=self.gettimeout(),
timeout_exc=socket.timeout) timeout_exc=socket.timeout)
except WantWriteError: except WantWriteError:
trampoline(self.fd.fileno(), trampoline(self.fd.fileno(),
write=True, write=True,
timeout=self.timeout, timeout=self.gettimeout(),
timeout_exc=socket.timeout) timeout_exc=socket.timeout)

View File

@@ -1,8 +1,9 @@
os_orig = __import__("os") os_orig = __import__("os")
import errno import errno
import socket socket = __import__("socket")
from eventlet import greenio from eventlet import greenio
from eventlet.greenio import get_errno
from eventlet import greenthread from eventlet import greenthread
from eventlet import hubs from eventlet import hubs
@@ -27,10 +28,10 @@ def read(fd, n):
try: try:
return __original_read__(fd, n) return __original_read__(fd, n)
except (OSError, IOError), e: except (OSError, IOError), e:
if e[0] != errno.EAGAIN: if get_errno(e) != errno.EAGAIN:
raise raise
except socket.error, e: except socket.error, e:
if e[0] == errno.EPIPE: if get_errno(e) == errno.EPIPE:
return '' return ''
raise raise
hubs.trampoline(fd, read=True) hubs.trampoline(fd, read=True)
@@ -45,10 +46,10 @@ def write(fd, st):
try: try:
return __original_write__(fd, st) return __original_write__(fd, st)
except (OSError, IOError), e: except (OSError, IOError), e:
if e[0] != errno.EAGAIN: if get_errno(e) != errno.EAGAIN:
raise raise
except socket.error, e: except socket.error, e:
if e[0] != errno.EPIPE: if get_errno(e) != errno.EPIPE:
raise raise
hubs.trampoline(fd, write=True) hubs.trampoline(fd, write=True)

View File

@@ -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 """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`. to profile Eventlet-based applications in preference to either :mod:`profile` or :mod:`cProfile`.
FIXME: No testcases for this module.
""" """
profile_orig = __import__('profile') profile_orig = __import__('profile')
@@ -34,12 +35,12 @@ for var in profile_orig.__all__:
import new import new
import sys import sys
import time
import traceback import traceback
import thread
import functools import functools
from eventlet import greenthread from eventlet import greenthread
from eventlet import patcher
thread = patcher.original('thread') # non-monkeypatched module needed
#This class provides the start() and stop() functions #This class provides the start() and stop() functions
class Profile(profile_orig.Profile): class Profile(profile_orig.Profile):

View File

@@ -1,27 +1,34 @@
__socket = __import__('socket') __socket = __import__('socket')
for var in __socket.__all__: for var in __socket.__all__:
exec "%s = __socket.%s" % (var, var) exec "%s = __socket.%s" % (var, var)
_fileobject = __socket._fileobject
from eventlet.hubs import get_hub from eventlet.hubs import get_hub
from eventlet.greenio import GreenSocket as socket from eventlet.greenio import GreenSocket as socket
from eventlet.greenio import SSL as _SSL # for exceptions from eventlet.greenio import SSL as _SSL # for exceptions
from eventlet.greenio import _GLOBAL_DEFAULT_TIMEOUT from eventlet.greenio import _GLOBAL_DEFAULT_TIMEOUT
import os from eventlet.greenio import _fileobject
os = __import__('os')
import sys import sys
import warnings import warnings
__patched__ = ['fromfd', 'socketpair', 'gethostbyname', 'create_connection', __patched__ = ['fromfd', 'socketpair', 'gethostbyname', 'create_connection',
'ssl', 'socket'] 'ssl', 'socket']
__original_fromfd__ = __socket.fromfd try:
def fromfd(*args): __original_fromfd__ = __socket.fromfd
def fromfd(*args):
return socket(__original_fromfd__(*args)) return socket(__original_fromfd__(*args))
except AttributeError:
pass
__original_socketpair__ = __socket.socketpair try:
def socketpair(*args): __original_socketpair__ = __socket.socketpair
def socketpair(*args):
one, two = __original_socketpair__(*args) one, two = __original_socketpair__(*args)
return socket(one), socket(two) return socket(one), socket(two)
except AttributeError:
pass
__original_gethostbyname__ = __socket.gethostbyname __original_gethostbyname__ = __socket.gethostbyname
def gethostbyname(name): def gethostbyname(name):

View File

@@ -4,11 +4,10 @@ for attr in dir(__ssl):
exec "%s = __ssl.%s" % (attr, attr) exec "%s = __ssl.%s" % (attr, attr)
import errno import errno
import time time = __import__('time')
from eventlet.hubs import trampoline from eventlet.hubs import trampoline
from thread import get_ident 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
@@ -36,7 +35,7 @@ class GreenSSLSocket(__ssl.SSLSocket):
sock = GreenSocket(sock) sock = GreenSocket(sock)
self.act_non_blocking = sock.act_non_blocking self.act_non_blocking = sock.act_non_blocking
self.timeout = sock.timeout self._timeout = sock.gettimeout()
super(GreenSSLSocket, self).__init__(sock.fd, *args, **kw) super(GreenSSLSocket, self).__init__(sock.fd, *args, **kw)
del sock 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) self.recvfrom_into = lambda buffer, nbytes=None, flags=0: GreenSSLSocket.recvfrom_into(self, buffer, nbytes, flags)
def settimeout(self, timeout): def settimeout(self, timeout):
self.timeout = timeout self._timeout = timeout
def gettimeout(self): def gettimeout(self):
return self.timeout return self._timeout
def setblocking(self, flag): def setblocking(self, flag):
if flag: if flag:
self.act_non_blocking = False self.act_non_blocking = False
self.timeout = None self._timeout = None
else: else:
self.act_non_blocking = True self.act_non_blocking = True
self.timeout = 0.0 self._timeout = 0.0
def _call_trampolining(self, func, *a, **kw): def _call_trampolining(self, func, *a, **kw):
if self.act_non_blocking: if self.act_non_blocking:
@@ -70,12 +69,12 @@ class GreenSSLSocket(__ssl.SSLSocket):
try: try:
return func(*a, **kw) return func(*a, **kw)
except SSLError, exc: except SSLError, exc:
if exc[0] == SSL_ERROR_WANT_READ: if get_errno(exc) == SSL_ERROR_WANT_READ:
trampoline(self.fileno(), trampoline(self.fileno(),
read=True, read=True,
timeout=self.gettimeout(), timeout=self.gettimeout(),
timeout_exc=timeout_exc('timed out')) timeout_exc=timeout_exc('timed out'))
elif exc[0] == SSL_ERROR_WANT_WRITE: elif get_errno(exc) == SSL_ERROR_WANT_WRITE:
trampoline(self.fileno(), trampoline(self.fileno(),
write=True, write=True,
timeout=self.gettimeout(), timeout=self.gettimeout(),
@@ -107,9 +106,9 @@ class GreenSSLSocket(__ssl.SSLSocket):
try: try:
v = self._sslobj.write(data) v = self._sslobj.write(data)
except SSLError, x: except SSLError, x:
if x.args[0] == SSL_ERROR_WANT_READ: if get_errno(x) == SSL_ERROR_WANT_READ:
return 0 return 0
elif x.args[0] == SSL_ERROR_WANT_WRITE: elif get_errno(x) == SSL_ERROR_WANT_WRITE:
return 0 return 0
else: else:
raise raise
@@ -122,8 +121,8 @@ 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 e[0] == errno.EWOULDBLOCK or \ if get_errno(e) == errno.EWOULDBLOCK or \
e[0] == errno.ENOTCONN: get_errno(e) == errno.ENOTCONN:
return 0 return 0
raise raise
@@ -156,10 +155,10 @@ 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 e[0] == errno.EWOULDBLOCK: if ge_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 e[0] in SOCKET_CLOSED: if get_errno(e) in SOCKET_CLOSED:
return '' return ''
raise raise
@@ -179,10 +178,10 @@ 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 e[0] == errno.EWOULDBLOCK: if get_errno(e) == errno.EWOULDBLOCK:
trampoline(self.fileno(), read=True, trampoline(self.fileno(), read=True,
timeout=self.gettimeout(), timeout_exc=timeout_exc('timed out')) timeout=self.gettimeout(), timeout_exc=timeout_exc('timed out'))
if e[0] in SOCKET_CLOSED: if get_errno(e) in SOCKET_CLOSED:
return '' return ''
raise raise
@@ -222,9 +221,9 @@ class GreenSSLSocket(__ssl.SSLSocket):
try: try:
return real_connect(self, addr) return real_connect(self, addr)
except orig_socket.error, exc: except orig_socket.error, exc:
if exc[0] in CONNECT_ERR: if get_errno(exc) in CONNECT_ERR:
trampoline(self.fileno(), write=True) trampoline(self.fileno(), write=True)
elif exc[0] in CONNECT_SUCCESS: elif get_errno(exc) in CONNECT_SUCCESS:
return return
else: else:
raise raise
@@ -234,10 +233,10 @@ class GreenSSLSocket(__ssl.SSLSocket):
try: try:
real_connect(self, addr) real_connect(self, addr)
except orig_socket.error, exc: except orig_socket.error, exc:
if exc[0] in CONNECT_ERR: if get_errno(exc) in CONNECT_ERR:
trampoline(self.fileno(), write=True, trampoline(self.fileno(), write=True,
timeout=end-time.time(), timeout_exc=timeout_exc('timed out')) timeout=end-time.time(), timeout_exc=timeout_exc('timed out'))
elif exc[0] in CONNECT_SUCCESS: elif get_errno(exc) in CONNECT_SUCCESS:
return return
else: else:
raise raise
@@ -273,7 +272,7 @@ class GreenSSLSocket(__ssl.SSLSocket):
set_nonblocking(newsock) set_nonblocking(newsock)
break break
except orig_socket.error, e: except orig_socket.error, e:
if e[0] != errno.EWOULDBLOCK: if get_errno(e) != errno.EWOULDBLOCK:
raise raise
trampoline(self.fileno(), read=True, timeout=self.gettimeout(), trampoline(self.fileno(), read=True, timeout=self.gettimeout(),
timeout_exc=timeout_exc('timed out')) timeout_exc=timeout_exc('timed out'))

View File

@@ -14,6 +14,27 @@ __all__ = ['GreenSocket', 'GreenPipe', 'shutdown_safe']
CONNECT_ERR = set((errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK)) CONNECT_ERR = set((errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK))
CONNECT_SUCCESS = set((0, errno.EISCONN)) 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.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,
@@ -36,7 +57,7 @@ def socket_accept(descriptor):
try: try:
return descriptor.accept() return descriptor.accept()
except socket.error, e: except socket.error, e:
if e[0] == errno.EWOULDBLOCK: if get_errno(e) == errno.EWOULDBLOCK:
return None return None
raise raise
@@ -96,7 +117,6 @@ class GreenSocket(object):
Green version of socket.socket class, that is intended to be 100% Green version of socket.socket class, that is intended to be 100%
API-compatible. API-compatible.
""" """
timeout = None
def __init__(self, family_or_realsock=socket.AF_INET, *args, **kwargs): def __init__(self, family_or_realsock=socket.AF_INET, *args, **kwargs):
if isinstance(family_or_realsock, (int, long)): if isinstance(family_or_realsock, (int, long)):
fd = _original_socket(family_or_realsock, *args, **kwargs) fd = _original_socket(family_or_realsock, *args, **kwargs)
@@ -107,9 +127,9 @@ class GreenSocket(object):
# import timeout from other socket, if it was there # import timeout from other socket, if it was there
try: try:
self.timeout = fd.gettimeout() or socket.getdefaulttimeout() self._timeout = fd.gettimeout() or socket.getdefaulttimeout()
except AttributeError: except AttributeError:
self.timeout = socket.getdefaulttimeout() self._timeout = socket.getdefaulttimeout()
set_nonblocking(fd) set_nonblocking(fd)
self.fd = fd self.fd = fd
@@ -134,6 +154,11 @@ class GreenSocket(object):
def proto(self): def proto(self):
return self.fd.proto 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): def accept(self):
if self.act_non_blocking: if self.act_non_blocking:
return self.fd.accept() return self.fd.accept()
@@ -184,7 +209,7 @@ class GreenSocket(object):
try: try:
trampoline(fd, write=True) trampoline(fd, write=True)
except socket.error, ex: except socket.error, ex:
return ex[0] return get_errno(ex)
else: else:
end = time.time() + self.gettimeout() end = time.time() + self.gettimeout()
while True: while True:
@@ -196,13 +221,13 @@ class GreenSocket(object):
trampoline(fd, write=True, timeout=end-time.time(), trampoline(fd, write=True, timeout=end-time.time(),
timeout_exc=socket.timeout(errno.EAGAIN)) timeout_exc=socket.timeout(errno.EAGAIN))
except socket.error, ex: except socket.error, ex:
return ex[0] return get_errno(ex)
def dup(self, *args, **kw): def dup(self, *args, **kw):
sock = self.fd.dup(*args, **kw) sock = self.fd.dup(*args, **kw)
set_nonblocking(sock) set_nonblocking(sock)
newsock = type(self)(sock) newsock = type(self)(sock)
newsock.settimeout(self.timeout) newsock.settimeout(self.gettimeout())
return newsock return newsock
def fileno(self, *args, **kw): def fileno(self, *args, **kw):
@@ -225,8 +250,8 @@ class GreenSocket(object):
fn = self.listen = self.fd.listen fn = self.listen = self.fd.listen
return fn(*args, **kw) return fn(*args, **kw)
def makefile(self, mode='r', bufsize=-1): def makefile(self, *args, **kw):
return socket._fileobject(self.dup(), mode, bufsize) return _fileobject(self.dup(), *args, **kw)
def makeGreenFile(self, mode='r', bufsize=-1): def makeGreenFile(self, mode='r', bufsize=-1):
warnings.warn("makeGreenFile has been deprecated, please use " warnings.warn("makeGreenFile has been deprecated, please use "
@@ -241,15 +266,15 @@ class GreenSocket(object):
try: try:
return fd.recv(buflen, flags) return fd.recv(buflen, flags)
except socket.error, e: except socket.error, e:
if e[0] in SOCKET_BLOCKING: if get_errno(e) in SOCKET_BLOCKING:
pass pass
elif e[0] in SOCKET_CLOSED: elif get_errno(e) in SOCKET_CLOSED:
return '' return ''
else: else:
raise raise
trampoline(fd, trampoline(fd,
read=True, read=True,
timeout=self.timeout, timeout=self.gettimeout(),
timeout_exc=socket.timeout("timed out")) timeout_exc=socket.timeout("timed out"))
def recvfrom(self, *args): def recvfrom(self, *args):
@@ -283,7 +308,7 @@ class GreenSocket(object):
try: try:
total_sent += fd.send(data[total_sent:], flags) total_sent += fd.send(data[total_sent:], flags)
except socket.error, e: except socket.error, e:
if e[0] not in SOCKET_BLOCKING: if get_errno(e) not in SOCKET_BLOCKING:
raise raise
if total_sent == len_data: if total_sent == len_data:
@@ -307,10 +332,10 @@ class GreenSocket(object):
def setblocking(self, flag): def setblocking(self, flag):
if flag: if flag:
self.act_non_blocking = False self.act_non_blocking = False
self.timeout = None self._timeout = None
else: else:
self.act_non_blocking = True self.act_non_blocking = True
self.timeout = 0.0 self._timeout = 0.0
def setsockopt(self, *args, **kw): def setsockopt(self, *args, **kw):
fn = self.setsockopt = self.fd.setsockopt fn = self.setsockopt = self.fd.setsockopt
@@ -334,10 +359,10 @@ class GreenSocket(object):
if howlong == 0.0: if howlong == 0.0:
self.setblocking(howlong) self.setblocking(howlong)
else: else:
self.timeout = howlong self._timeout = howlong
def gettimeout(self): def gettimeout(self):
return self.timeout return self._timeout
class GreenPipe(object): class GreenPipe(object):
@@ -367,10 +392,10 @@ class GreenPipe(object):
try: try:
return fd.read(buflen) return fd.read(buflen)
except IOError, e: except IOError, e:
if e[0] != errno.EAGAIN: if get_errno(e) != errno.EAGAIN:
return '' return ''
except socket.error, e: except socket.error, e:
if e[0] == errno.EPIPE: if get_errno(e) == errno.EPIPE:
return '' return ''
raise raise
trampoline(fd, read=True) trampoline(fd, read=True)
@@ -399,13 +424,13 @@ class GreenPipe(object):
fd.flush() fd.flush()
return len(data) return len(data)
except IOError, e: except IOError, e:
if e[0] != errno.EAGAIN: if get_errno(e) != errno.EAGAIN:
raise raise
except ValueError, e: except ValueError, e:
# what's this for? # what's this for?
pass pass
except socket.error, e: except socket.error, e:
if e[0] != errno.EPIPE: if get_errno(e) != errno.EPIPE:
raise raise
trampoline(fd, write=True) trampoline(fd, write=True)
@@ -506,6 +531,6 @@ def shutdown_safe(sock):
except socket.error, e: except socket.error, e:
# we don't care if the socket is already closed; # we don't care if the socket is already closed;
# this will often be the case in an http server context # this will often be the case in an http server context
if e[0] != errno.ENOTCONN: if get_errno(e) != errno.ENOTCONN:
raise raise

View File

@@ -7,6 +7,13 @@ from eventlet.hubs import timer
from eventlet import patcher from eventlet import patcher
time = patcher.original('time') 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" READ="read"
WRITE="write" WRITE="write"
@@ -111,7 +118,7 @@ class BaseHub(object):
cur.parent = self.greenlet cur.parent = self.greenlet
except ValueError: except ValueError:
pass # gets raised if there is a greenlet parent cycle pass # gets raised if there is a greenlet parent cycle
sys.exc_clear() sys_exc_clear()
return self.greenlet.switch() return self.greenlet.switch()
def squelch_exception(self, fileno, exc_info): def squelch_exception(self, fileno, exc_info):

View File

@@ -234,7 +234,7 @@ def setup():
csock = util.__original_socket__(socket.AF_INET, socket.SOCK_STREAM) csock = util.__original_socket__(socket.AF_INET, socket.SOCK_STREAM)
csock.connect(('localhost', sock.getsockname()[1])) csock.connect(('localhost', sock.getsockname()[1]))
nsock, addr = sock.accept() nsock, addr = sock.accept()
_rfile = greenio.Green_fileobject(greenio.GreenSocket(csock)) _rfile = greenio.GreenSocket(csock).makefile()
_wfile = nsock.makefile() _wfile = nsock.makefile()
_reqq = Queue(maxsize=-1) _reqq = Queue(maxsize=-1)

View File

@@ -10,6 +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
DEFAULT_MAX_SIMULTANEOUS_REQUESTS = 1024 DEFAULT_MAX_SIMULTANEOUS_REQUESTS = 1024
DEFAULT_MAX_HTTP_VERSION = 'HTTP/1.1' DEFAULT_MAX_HTTP_VERSION = 'HTTP/1.1'
@@ -41,15 +42,6 @@ BROKEN_SOCK = set((errno.EPIPE, errno.ECONNRESET))
# special flag return value for apps # special flag return value for apps
ALREADY_HANDLED = object() 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): class Input(object):
def __init__(self, def __init__(self,
rfile, rfile,

View File

@@ -41,7 +41,7 @@ class TestApi(TestCase):
def accept_once(listenfd): def accept_once(listenfd):
try: try:
conn, addr = listenfd.accept() conn, addr = listenfd.accept()
fd = conn.makefile() fd = conn.makefile(mode='w')
conn.close() conn.close()
fd.write('hello\n') fd.write('hello\n')
fd.close() fd.close()

View File

@@ -43,7 +43,7 @@ class TestGreenIo(LimitedTestCase):
self.assertEqual(e.args[0], 'timed out') self.assertEqual(e.args[0], 'timed out')
except socket.error, e: except socket.error, e:
# unreachable is also a valid outcome # 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 raise
def test_accept_timeout(self): def test_accept_timeout(self):