Commit 5c11789c authored by Denis Bilenko's avatar Denis Bilenko

gevent package: (some) py3k compatibility. Original patches by Damien Churchill.

- define basestring in hub.py for version that don't have it
- use exc_info()
- define exc_clear() in hub.py as no-op
- use "exec (xxx)" instead of "exec xxx"
parent b0af1ee6
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
from gevent.greenlet import Greenlet, getfuncname from gevent.greenlet import Greenlet, getfuncname
from gevent.event import Event from gevent.event import Event
import _socket import _socket
import sys
__all__ = ['BaseServer'] __all__ = ['BaseServer']
...@@ -94,7 +95,8 @@ class BaseServer(object): ...@@ -94,7 +95,8 @@ class BaseServer(object):
if hasattr(self, 'socket'): if hasattr(self, 'socket'):
try: try:
fileno = self.socket.fileno() fileno = self.socket.fileno()
except Exception, ex: except Exception:
ex = sys.exc_info()[1]
fileno = str(ex) fileno = str(ex)
result = 'fileno=%s ' % fileno result = 'fileno=%s ' % fileno
else: else:
...@@ -104,7 +106,8 @@ class BaseServer(object): ...@@ -104,7 +106,8 @@ class BaseServer(object):
result += 'address=%s:%s' % self.address result += 'address=%s:%s' % self.address
else: else:
result += 'address=%s' % (self.address, ) result += 'address=%s' % (self.address, )
except Exception, ex: except Exception:
ex = sys.exc_info()[1]
result += str(ex) or '<error>' result += str(ex) or '<error>'
try: try:
handle = getfuncname(self.__dict__['handle']) handle = getfuncname(self.__dict__['handle'])
...@@ -204,7 +207,8 @@ def _tcp_listener(address, backlog=50, reuse_addr=None): ...@@ -204,7 +207,8 @@ def _tcp_listener(address, backlog=50, reuse_addr=None):
sock.setsockopt(_socket.SOL_SOCKET, _socket.SO_REUSEADDR, reuse_addr) sock.setsockopt(_socket.SOL_SOCKET, _socket.SO_REUSEADDR, reuse_addr)
try: try:
sock.bind(address) sock.bind(address)
except _socket.error, ex: except _socket.error:
ex = sys.exc_info()[1]
strerror = getattr(ex, 'strerror', None) strerror = getattr(ex, 'strerror', None)
if strerror is not None: if strerror is not None:
ex.strerror = strerror + ': ' + repr(address) ex.strerror = strerror + ': ' + repr(address)
......
...@@ -78,7 +78,8 @@ class Semaphore(object): ...@@ -78,7 +78,8 @@ class Semaphore(object):
try: try:
result = self.hub.switch() result = self.hub.switch()
assert result is self, 'Invalid switch into Semaphore.wait(): %r' % (result, ) assert result is self, 'Invalid switch into Semaphore.wait(): %r' % (result, )
except Timeout, ex: except Timeout:
ex = sys.exc_info()[1]
if ex is not timer: if ex is not timer:
raise raise
finally: finally:
...@@ -102,7 +103,8 @@ class Semaphore(object): ...@@ -102,7 +103,8 @@ class Semaphore(object):
try: try:
result = self.hub.switch() result = self.hub.switch()
assert result is self, 'Invalid switch into Semaphore.acquire(): %r' % (result, ) assert result is self, 'Invalid switch into Semaphore.acquire(): %r' % (result, )
except Timeout, ex: except Timeout:
ex = sys.exc_info()[1]
if ex is timer: if ex is timer:
return False return False
raise raise
......
...@@ -74,7 +74,8 @@ class Event(object): ...@@ -74,7 +74,8 @@ class Event(object):
try: try:
result = self.hub.switch() result = self.hub.switch()
assert result is self, 'Invalid switch into Event.wait(): %r' % (result, ) assert result is self, 'Invalid switch into Event.wait(): %r' % (result, )
except Timeout, ex: except Timeout:
ex = sys.exc_info()[1]
if ex is not timer: if ex is not timer:
raise raise
finally: finally:
...@@ -255,7 +256,8 @@ class AsyncResult(object): ...@@ -255,7 +256,8 @@ class AsyncResult(object):
assert result is self, 'Invalid switch into AsyncResult.wait(): %r' % (result, ) assert result is self, 'Invalid switch into AsyncResult.wait(): %r' % (result, )
finally: finally:
timer.cancel() timer.cancel()
except Timeout, exc: except Timeout:
exc = sys.exc_info()[1]
self.unlink(switch) self.unlink(switch)
if exc is not timer: if exc is not timer:
raise raise
......
...@@ -345,9 +345,9 @@ class Greenlet(greenlet): ...@@ -345,9 +345,9 @@ class Greenlet(greenlet):
assert result is self, 'Invalid switch into Greenlet.join(): %r' % (result, ) assert result is self, 'Invalid switch into Greenlet.join(): %r' % (result, )
finally: finally:
t.cancel() t.cancel()
except Timeout, ex: except Timeout:
self.unlink(switch) self.unlink(switch)
if ex is not t: if sys.exc_info()[1] is not t:
raise raise
except: except:
self.unlink(switch) self.unlink(switch)
......
...@@ -35,7 +35,10 @@ except ImportError: ...@@ -35,7 +35,10 @@ except ImportError:
getcurrent = greenlet.getcurrent getcurrent = greenlet.getcurrent
GreenletExit = greenlet.GreenletExit GreenletExit = greenlet.GreenletExit
thread = __import__('thread') if sys.version_info[0] <= 2:
thread = __import__('thread')
else:
thread = __import__('_thread')
threadlocal = thread._local threadlocal = thread._local
_threadlocal = threadlocal() _threadlocal = threadlocal()
_threadlocal.Hub = None _threadlocal.Hub = None
...@@ -176,14 +179,24 @@ def set_hub(hub): ...@@ -176,14 +179,24 @@ def set_hub(hub):
_threadlocal.hub = hub _threadlocal.hub = hub
if sys.version_info[0] >= 3:
basestring = (str, bytes)
def exc_clear():
pass
else:
basestring = basestring
exc_clear = sys.exc_clear
def _import(path): def _import(path):
if isinstance(path, list): if isinstance(path, list):
error = ImportError('Cannot import from empty list: %r' % (path, )) error = ImportError('Cannot import from empty list: %r' % (path, ))
for item in path: for item in path:
try: try:
return _import(item) return _import(item)
except ImportError, ex: except ImportError:
error = ex error = sys.exc_info()[1]
raise error raise error
if not isinstance(path, basestring): if not isinstance(path, basestring):
return path return path
...@@ -253,7 +266,7 @@ class Hub(greenlet): ...@@ -253,7 +266,7 @@ class Hub(greenlet):
switch_out() switch_out()
except: except:
self.handle_error(switch_out, *sys.exc_info()) self.handle_error(switch_out, *sys.exc_info())
sys.exc_clear() exc_clear()
return greenlet.switch(self) return greenlet.switch(self)
finally: finally:
core.set_exc_info(exc_type, exc_value) core.set_exc_info(exc_type, exc_value)
......
...@@ -9,6 +9,8 @@ concurrency: its :meth:`spawn <Pool.spawn>` method blocks if the number of ...@@ -9,6 +9,8 @@ concurrency: its :meth:`spawn <Pool.spawn>` method blocks if the number of
greenlets in the pool has already reached the limit, until there is a free slot. greenlets in the pool has already reached the limit, until there is a free slot.
""" """
import sys
from gevent.hub import GreenletExit, getcurrent from gevent.hub import GreenletExit, getcurrent
from gevent.greenlet import joinall, Greenlet from gevent.greenlet import joinall, Greenlet
from gevent.timeout import Timeout from gevent.timeout import Timeout
...@@ -114,7 +116,8 @@ class Group(object): ...@@ -114,7 +116,8 @@ class Group(object):
if not block: if not block:
break break
joinall(self.greenlets) joinall(self.greenlets)
except Timeout, ex: except Timeout:
ex = sys.exc_info()[1]
if ex is not timer: if ex is not timer:
raise raise
finally: finally:
......
...@@ -300,7 +300,8 @@ class WSGIHandler(object): ...@@ -300,7 +300,8 @@ class WSGIHandler(object):
try: try:
if not self.read_request(raw_requestline): if not self.read_request(raw_requestline):
return ('400', _BAD_REQUEST_RESPONSE) return ('400', _BAD_REQUEST_RESPONSE)
except Exception, ex: except Exception:
ex = sys.exc_info()[1]
if not isinstance(ex, ValueError): if not isinstance(ex, ValueError):
traceback.print_exc() traceback.print_exc()
self.log_error('Invalid request: %s', str(ex) or ex.__class__.__name__) self.log_error('Invalid request: %s', str(ex) or ex.__class__.__name__)
...@@ -310,9 +311,10 @@ class WSGIHandler(object): ...@@ -310,9 +311,10 @@ class WSGIHandler(object):
self.application = self.server.application self.application = self.server.application
try: try:
self.handle_one_response() self.handle_one_response()
except socket.error, ex: except socket.error:
ex = sys.exc_info()[1]
# Broken pipe, connection reset by peer # Broken pipe, connection reset by peer
if ex[0] in (errno.EPIPE, errno.ECONNRESET): if ex.args[0] in (errno.EPIPE, errno.ECONNRESET):
sys.exc_clear() sys.exc_clear()
else: else:
raise raise
......
...@@ -30,7 +30,13 @@ means repeatedly calling :meth:`get <Queue.get>` until :meth:`get <Queue.get>` r ...@@ -30,7 +30,13 @@ means repeatedly calling :meth:`get <Queue.get>` until :meth:`get <Queue.get>` r
import sys import sys
import heapq import heapq
import collections import collections
from Queue import Full, Empty
try:
from Queue import Full, Empty
except ImportError:
__queue__ = __import__('queue')
Full = __queue__.Full
Empty = __queue__.Empty
from gevent.timeout import Timeout from gevent.timeout import Timeout
from gevent.hub import get_hub, Waiter, getcurrent, _NONE from gevent.hub import get_hub, Waiter, getcurrent, _NONE
......
import os import os
import sys
from _socket import getservbyname, getaddrinfo, gaierror, error from _socket import getservbyname, getaddrinfo, gaierror, error
from gevent.hub import Waiter, get_hub from gevent.hub import Waiter, get_hub, basestring
from gevent.socket import AF_UNSPEC, AF_INET, AF_INET6, SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, AI_NUMERICHOST, EAI_SERVICE from gevent.socket import AF_UNSPEC, AF_INET, AF_INET6, SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, AI_NUMERICHOST, EAI_SERVICE
from gevent.ares import channel from gevent.ares import channel
...@@ -69,7 +70,8 @@ class Resolver(object): ...@@ -69,7 +70,8 @@ class Resolver(object):
port = getservbyname(port, 'udp') port = getservbyname(port, 'udp')
else: else:
raise gaierror(EAI_SERVICE, 'Servname not supported for ai_socktype') raise gaierror(EAI_SERVICE, 'Servname not supported for ai_socktype')
except error, ex: except error:
ex = sys.exc_info()[1]
if 'not found' in str(ex): if 'not found' in str(ex):
raise gaierror(EAI_SERVICE, 'Servname not supported for ai_socktype') raise gaierror(EAI_SERVICE, 'Servname not supported for ai_socktype')
else: else:
...@@ -150,7 +152,8 @@ class Resolver(object): ...@@ -150,7 +152,8 @@ class Resolver(object):
self.ares.gethostbyaddr(waiter, ip_address) self.ares.gethostbyaddr(waiter, ip_address)
try: try:
return waiter.get() return waiter.get()
except ValueError, ex: except ValueError:
ex = sys.exc_info()[1]
if not str(ex).startswith('illegal IP'): if not str(ex).startswith('illegal IP'):
raise raise
# socket.gethostbyaddr also accepts domain names; let's do that too # socket.gethostbyaddr also accepts domain names; let's do that too
...@@ -175,7 +178,8 @@ class Resolver(object): ...@@ -175,7 +178,8 @@ class Resolver(object):
self.ares.getnameinfo(waiter, sockaddr, flags) self.ares.getnameinfo(waiter, sockaddr, flags)
try: try:
result = waiter.get() result = waiter.get()
except ValueError, ex: except ValueError:
ex = sys.exc_info()[1]
if not str(ex).startswith('illegal IP'): if not str(ex).startswith('illegal IP'):
raise raise
# socket.getnameinfo also accepts domain names; let's do that too # socket.getnameinfo also accepts domain names; let's do that too
......
# Copyright (c) 2009-2010 Denis Bilenko. See LICENSE for details. # Copyright (c) 2009-2010 Denis Bilenko. See LICENSE for details.
import sys
from gevent.timeout import Timeout from gevent.timeout import Timeout
from gevent.event import Event from gevent.event import Event
from gevent.hub import get_hub from gevent.hub import get_hub
...@@ -63,7 +63,8 @@ def select(rlist, wlist, xlist, timeout=None): ...@@ -63,7 +63,8 @@ def select(rlist, wlist, xlist, timeout=None):
watcher.priority = MAXPRI watcher.priority = MAXPRI
watcher.start(result.add_write, writefd) watcher.start(result.add_write, writefd)
watchers.append(watcher) watchers.append(watcher)
except IOError, ex: except IOError:
ex = sys.exc_info()[1]
raise error(*ex.args) raise error(*ex.args)
result.event.wait(timeout=timeout) result.event.wait(timeout=timeout)
return result.read, result.write, [] return result.read, result.write, []
......
...@@ -78,6 +78,8 @@ __imports__ = ['error', ...@@ -78,6 +78,8 @@ __imports__ = ['error',
import sys import sys
import time import time
from gevent.hub import get_hub, basestring
from gevent.timeout import Timeout
is_windows = sys.platform == 'win32' is_windows = sys.platform == 'win32'
...@@ -124,9 +126,6 @@ for name in __socket__.__all__: ...@@ -124,9 +126,6 @@ for name in __socket__.__all__:
del name, value del name, value
from gevent.hub import get_hub
from gevent.timeout import Timeout
def wait(io, timeout=None, timeout_exc=timeout('timed out')): def wait(io, timeout=None, timeout_exc=timeout('timed out')):
"""Block the current greenlet until *io* is ready. """Block the current greenlet until *io* is ready.
...@@ -276,8 +275,8 @@ class socket(object): ...@@ -276,8 +275,8 @@ class socket(object):
def _formatinfo(self): def _formatinfo(self):
try: try:
fileno = self.fileno() fileno = self.fileno()
except Exception, ex: except Exception:
fileno = str(ex) fileno = str(sys.exc_info()[1])
try: try:
sockname = self.getsockname() sockname = self.getsockname()
sockname = '%s:%s' % sockname sockname = '%s:%s' % sockname
...@@ -322,7 +321,8 @@ class socket(object): ...@@ -322,7 +321,8 @@ class socket(object):
try: try:
client_socket, address = sock.accept() client_socket, address = sock.accept()
break break
except error, ex: except error:
ex = sys.exc_info()[1]
if ex[0] != EWOULDBLOCK or self.timeout == 0.0: if ex[0] != EWOULDBLOCK or self.timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
...@@ -370,9 +370,10 @@ class socket(object): ...@@ -370,9 +370,10 @@ class socket(object):
return self.connect(address) or 0 return self.connect(address) or 0
except timeout: except timeout:
return EAGAIN return EAGAIN
except error, ex: except error:
ex = sys.exc_info()[1]
if type(ex) is error: if type(ex) is error:
return ex[0] return ex.args[0]
else: else:
raise # gaierror is not silented by connect_ex raise # gaierror is not silented by connect_ex
...@@ -393,17 +394,19 @@ class socket(object): ...@@ -393,17 +394,19 @@ class socket(object):
while True: while True:
try: try:
return sock.recv(*args) return sock.recv(*args)
except error, ex: except error:
if ex[0] == EBADF: ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return '' return ''
if ex[0] != EWOULDBLOCK or self.timeout == 0.0: if ex.args[0] != EWOULDBLOCK or self.timeout == 0.0:
raise raise
# QQQ without clearing exc_info test__refcount.test_clean_exit fails # QQQ without clearing exc_info test__refcount.test_clean_exit fails
sys.exc_clear() sys.exc_clear()
try: try:
self._wait(self._read_event) self._wait(self._read_event)
except error, ex: except error:
if ex[0] == EBADF: ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return '' return ''
raise raise
...@@ -412,8 +415,9 @@ class socket(object): ...@@ -412,8 +415,9 @@ class socket(object):
while True: while True:
try: try:
return sock.recvfrom(*args) return sock.recvfrom(*args)
except error, ex: except error:
if ex[0] != EWOULDBLOCK or self.timeout == 0.0: ex = sys.exc_info()[1]
if ex.args[0] != EWOULDBLOCK or self.timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
self._wait(self._read_event) self._wait(self._read_event)
...@@ -423,8 +427,9 @@ class socket(object): ...@@ -423,8 +427,9 @@ class socket(object):
while True: while True:
try: try:
return sock.recvfrom_into(*args) return sock.recvfrom_into(*args)
except error, ex: except error:
if ex[0] != EWOULDBLOCK or self.timeout == 0.0: ex = sys.exc_info()[1]
if ex.args[0] != EWOULDBLOCK or self.timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
self._wait(self._read_event) self._wait(self._read_event)
...@@ -434,16 +439,18 @@ class socket(object): ...@@ -434,16 +439,18 @@ class socket(object):
while True: while True:
try: try:
return sock.recv_into(*args) return sock.recv_into(*args)
except error, ex: except error:
if ex[0] == EBADF: ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0 return 0
if ex[0] != EWOULDBLOCK or self.timeout == 0.0: if ex.args[0] != EWOULDBLOCK or self.timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
try: try:
self._wait(self._read_event) self._wait(self._read_event)
except error, ex: except error:
if ex[0] == EBADF: ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0 return 0
raise raise
...@@ -453,20 +460,23 @@ class socket(object): ...@@ -453,20 +460,23 @@ class socket(object):
timeout = self.timeout timeout = self.timeout
try: try:
return sock.send(data, flags) return sock.send(data, flags)
except error, ex: except error:
if ex[0] != EWOULDBLOCK or timeout == 0.0: ex = sys.exc_info()[1]
if ex.args[0] != EWOULDBLOCK or timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
try: try:
self._wait(self._write_event) self._wait(self._write_event)
except error, ex: except error:
if ex[0] == EBADF: ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0 return 0
raise raise
try: try:
return sock.send(data, flags) return sock.send(data, flags)
except error, ex2: except error:
if ex2[0] == EWOULDBLOCK: ex2 = sys.exc_info()[1]
if ex2.args[0] == EWOULDBLOCK:
return 0 return 0
raise raise
...@@ -495,15 +505,17 @@ class socket(object): ...@@ -495,15 +505,17 @@ class socket(object):
sock = self._sock sock = self._sock
try: try:
return sock.sendto(*args) return sock.sendto(*args)
except error, ex: except error:
if ex[0] != EWOULDBLOCK or timeout == 0.0: ex = sys.exc_info()[1]
if ex.args[0] != EWOULDBLOCK or timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
self._wait(self._write_event) self._wait(self._write_event)
try: try:
return sock.sendto(*args) return sock.sendto(*args)
except error, ex2: except error:
if ex2[0] == EWOULDBLOCK: ex2 = sys.exc_info()[1]
if ex2.args[0] == EWOULDBLOCK:
return 0 return 0
raise raise
...@@ -546,7 +558,7 @@ class socket(object): ...@@ -546,7 +558,7 @@ class socket(object):
_s = ("def %s(self, *args): return self._sock.%s(*args)\n\n" _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
"%s.__doc__ = _realsocket.%s.__doc__\n") "%s.__doc__ = _realsocket.%s.__doc__\n")
for _m in set(__socket__._socketmethods) - set(locals()): for _m in set(__socket__._socketmethods) - set(locals()):
exec _s % (_m, _m, _m, _m) exec (_s % (_m, _m, _m, _m))
del _m, _s del _m, _s
SocketType = socket SocketType = socket
...@@ -616,8 +628,8 @@ def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=N ...@@ -616,8 +628,8 @@ def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=N
sock.bind(source_address) sock.bind(source_address)
sock.connect(sa) sock.connect(sa)
return sock return sock
except error, ex: except error:
err = ex err = sys.exc_info()[1]
sys.exc_clear() sys.exc_clear()
if sock is not None: if sock is not None:
sock.close() sock.close()
......
...@@ -22,6 +22,7 @@ import sys ...@@ -22,6 +22,7 @@ import sys
import errno import errno
from gevent.socket import socket, _fileobject, timeout_default from gevent.socket import socket, _fileobject, timeout_default
from gevent.socket import error as socket_error, EBADF from gevent.socket import error as socket_error, EBADF
from gevent.hub import basestring
__implements__ = ['SSLSocket', __implements__ = ['SSLSocket',
'wrap_socket', 'wrap_socket',
...@@ -105,7 +106,8 @@ class SSLSocket(socket): ...@@ -105,7 +106,8 @@ class SSLSocket(socket):
while True: while True:
try: try:
return self._sslobj.read(len) return self._sslobj.read(len)
except SSLError, ex: except SSLError:
ex = sys.exc_info()[1]
if ex.args[0] == SSL_ERROR_EOF and self.suppress_ragged_eofs: if ex.args[0] == SSL_ERROR_EOF and self.suppress_ragged_eofs:
return '' return ''
elif ex.args[0] == SSL_ERROR_WANT_READ: elif ex.args[0] == SSL_ERROR_WANT_READ:
...@@ -114,8 +116,9 @@ class SSLSocket(socket): ...@@ -114,8 +116,9 @@ class SSLSocket(socket):
sys.exc_clear() sys.exc_clear()
try: try:
self._wait(self._read_event, timeout_exc=_SSLErrorReadTimeout) self._wait(self._read_event, timeout_exc=_SSLErrorReadTimeout)
except socket_error, ex: except socket_error:
if ex[0] == EBADF: ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return '' return ''
raise raise
elif ex.args[0] == SSL_ERROR_WANT_WRITE: elif ex.args[0] == SSL_ERROR_WANT_WRITE:
...@@ -125,8 +128,9 @@ class SSLSocket(socket): ...@@ -125,8 +128,9 @@ class SSLSocket(socket):
try: try:
# note: using _SSLErrorReadTimeout rather than _SSLErrorWriteTimeout below is intentional # note: using _SSLErrorReadTimeout rather than _SSLErrorWriteTimeout below is intentional
self._wait(self._write_event, timeout_exc=_SSLErrorReadTimeout) self._wait(self._write_event, timeout_exc=_SSLErrorReadTimeout)
except socket_error, ex: except socket_error:
if ex[0] == EBADF: ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return '' return ''
raise raise
else: else:
...@@ -138,15 +142,17 @@ class SSLSocket(socket): ...@@ -138,15 +142,17 @@ class SSLSocket(socket):
while True: while True:
try: try:
return self._sslobj.write(data) return self._sslobj.write(data)
except SSLError, ex: except SSLError:
ex = sys.exc_info()[1]
if ex.args[0] == SSL_ERROR_WANT_READ: if ex.args[0] == SSL_ERROR_WANT_READ:
if self.timeout == 0.0: if self.timeout == 0.0:
raise raise
sys.exc_clear() sys.exc_clear()
try: try:
self._wait(self._read_event, timeout_exc=_SSLErrorWriteTimeout) self._wait(self._read_event, timeout_exc=_SSLErrorWriteTimeout)
except socket_error, ex: except socket_error:
if ex[0] == EBADF: ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0 return 0
raise raise
elif ex.args[0] == SSL_ERROR_WANT_WRITE: elif ex.args[0] == SSL_ERROR_WANT_WRITE:
...@@ -155,8 +161,9 @@ class SSLSocket(socket): ...@@ -155,8 +161,9 @@ class SSLSocket(socket):
sys.exc_clear() sys.exc_clear()
try: try:
self._wait(self._write_event, timeout_exc=_SSLErrorWriteTimeout) self._wait(self._write_event, timeout_exc=_SSLErrorWriteTimeout)
except socket_error, ex: except socket_error:
if ex[0] == EBADF: ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0 return 0
raise raise
else: else:
...@@ -186,15 +193,17 @@ class SSLSocket(socket): ...@@ -186,15 +193,17 @@ class SSLSocket(socket):
while True: while True:
try: try:
v = self._sslobj.write(data) v = self._sslobj.write(data)
except SSLError, x: except SSLError:
x = sys.exc_info()[1]
if x.args[0] == SSL_ERROR_WANT_READ: if x.args[0] == SSL_ERROR_WANT_READ:
if self.timeout == 0.0: if self.timeout == 0.0:
return 0 return 0
sys.exc_clear() sys.exc_clear()
try: try:
self._wait(self._read_event) self._wait(self._read_event)
except socket_error, ex: except socket_error:
if ex[0] == EBADF: ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0 return 0
raise raise
elif x.args[0] == SSL_ERROR_WANT_WRITE: elif x.args[0] == SSL_ERROR_WANT_WRITE:
...@@ -203,8 +212,9 @@ class SSLSocket(socket): ...@@ -203,8 +212,9 @@ class SSLSocket(socket):
sys.exc_clear() sys.exc_clear()
try: try:
self._wait(self._write_event) self._wait(self._write_event)
except socket_error, ex: except socket_error:
if ex[0] == EBADF: ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0 return 0
raise raise
else: else:
...@@ -249,15 +259,17 @@ class SSLSocket(socket): ...@@ -249,15 +259,17 @@ class SSLSocket(socket):
v = len(tmp_buffer) v = len(tmp_buffer)
buffer[:v] = tmp_buffer buffer[:v] = tmp_buffer
return v return v
except SSLError, x: except SSLError:
x = sys.exc_info()[1]
if x.args[0] == SSL_ERROR_WANT_READ: if x.args[0] == SSL_ERROR_WANT_READ:
sys.exc_clear() sys.exc_clear()
if self.timeout == 0.0: if self.timeout == 0.0:
raise raise
try: try:
self._wait(self._read_event) self._wait(self._read_event)
except socket_error, ex: except socket_error:
if ex[0] == EBADF: ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return 0 return 0
raise raise
continue continue
...@@ -290,7 +302,8 @@ class SSLSocket(socket): ...@@ -290,7 +302,8 @@ class SSLSocket(socket):
while True: while True:
try: try:
return self._sslobj.shutdown() return self._sslobj.shutdown()
except SSLError, ex: except SSLError:
ex = sys.exc_info()[1]
if ex.args[0] == SSL_ERROR_EOF and self.suppress_ragged_eofs: if ex.args[0] == SSL_ERROR_EOF and self.suppress_ragged_eofs:
return '' return ''
elif ex.args[0] == SSL_ERROR_WANT_READ: elif ex.args[0] == SSL_ERROR_WANT_READ:
...@@ -299,8 +312,9 @@ class SSLSocket(socket): ...@@ -299,8 +312,9 @@ class SSLSocket(socket):
sys.exc_clear() sys.exc_clear()
try: try:
self._wait(self._read_event, timeout_exc=_SSLErrorReadTimeout) self._wait(self._read_event, timeout_exc=_SSLErrorReadTimeout)
except socket_error, ex: except socket_error:
if ex[0] == EBADF: ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return '' return ''
raise raise
elif ex.args[0] == SSL_ERROR_WANT_WRITE: elif ex.args[0] == SSL_ERROR_WANT_WRITE:
...@@ -309,8 +323,9 @@ class SSLSocket(socket): ...@@ -309,8 +323,9 @@ class SSLSocket(socket):
sys.exc_clear() sys.exc_clear()
try: try:
self._wait(self._write_event, timeout_exc=_SSLErrorWriteTimeout) self._wait(self._write_event, timeout_exc=_SSLErrorWriteTimeout)
except socket_error, ex: except socket_error:
if ex[0] == EBADF: ex = sys.exc_info()[1]
if ex.args[0] == EBADF:
return '' return ''
raise raise
else: else:
...@@ -340,7 +355,8 @@ class SSLSocket(socket): ...@@ -340,7 +355,8 @@ class SSLSocket(socket):
while True: while True:
try: try:
return self._sslobj.do_handshake() return self._sslobj.do_handshake()
except SSLError, ex: except SSLError:
ex = sys.exc_info()[1]
if ex.args[0] == SSL_ERROR_WANT_READ: if ex.args[0] == SSL_ERROR_WANT_READ:
if self.timeout == 0.0: if self.timeout == 0.0:
raise raise
......
...@@ -13,7 +13,8 @@ to arbitrary code. ...@@ -13,7 +13,8 @@ to arbitrary code.
which no switches occur, :class:`Timeout` is powerless. which no switches occur, :class:`Timeout` is powerless.
""" """
from gevent.hub import getcurrent, _NONE, get_hub import sys
from gevent.hub import getcurrent, _NONE, get_hub, basestring
__all__ = ['Timeout', __all__ = ['Timeout',
'with_timeout'] 'with_timeout']
...@@ -190,8 +191,8 @@ def with_timeout(seconds, function, *args, **kwds): ...@@ -190,8 +191,8 @@ def with_timeout(seconds, function, *args, **kwds):
try: try:
try: try:
return function(*args, **kwds) return function(*args, **kwds)
except Timeout, ex: except Timeout:
if ex is timeout and timeout_value is not _NONE: if sys.exc_info()[1] is timeout and timeout_value is not _NONE:
return timeout_value return timeout_value
raise raise
finally: finally:
......
# Copyright (c) 2009 Denis Bilenko. See LICENSE for details. # Copyright (c) 2009 Denis Bilenko. See LICENSE for details.
__all__ = ['wrap_errors'] __all__ = ['wrap_errors']
import sys
class wrap_errors(object): class wrap_errors(object):
"""Helper to make function return an exception, rather than raise it. """Helper to make function return an exception, rather than raise it.
...@@ -35,8 +37,8 @@ class wrap_errors(object): ...@@ -35,8 +37,8 @@ class wrap_errors(object):
func = self.func func = self.func
try: try:
return func(*args, **kwargs) return func(*args, **kwargs)
except self.errors, ex: except self.errors:
return ex return sys.exc_info()[1]
def __str__(self): def __str__(self):
return str(self.func) return str(self.func)
......
# Copyright (c) 2009-2010 Denis Bilenko. See LICENSE for details. # Copyright (c) 2009-2010 Denis Bilenko. See LICENSE for details.
import sys import sys
import traceback import traceback
from urllib import unquote try:
from urllib import unquote
except ImportError:
from urllib.parse import unquote
from datetime import datetime from datetime import datetime
socket = __import__('socket') socket = __import__('socket')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment