python3 compatibility
- dict.items().pop() in proc - str/bytes in backdoor, api_test, ssl_test, test__refcount - import httplib from six - PEP-8 fixes
This commit is contained in:
@@ -1,13 +1,13 @@
|
||||
from __future__ import print_function
|
||||
|
||||
from code import InteractiveConsole
|
||||
import errno
|
||||
import socket
|
||||
import sys
|
||||
import errno
|
||||
from code import InteractiveConsole
|
||||
|
||||
import eventlet
|
||||
from eventlet import hubs
|
||||
from eventlet.support import greenlets, get_errno
|
||||
from eventlet.support import greenlets, get_errno, six
|
||||
|
||||
try:
|
||||
sys.ps1
|
||||
@@ -29,12 +29,14 @@ class FileProxy(object):
|
||||
def flush(self):
|
||||
pass
|
||||
|
||||
def write(self, *a, **kw):
|
||||
self.f.write(*a, **kw)
|
||||
def write(self, data, *a, **kw):
|
||||
data = six.b(data)
|
||||
self.f.write(data, *a, **kw)
|
||||
self.f.flush()
|
||||
|
||||
def readline(self, *a):
|
||||
return self.f.readline(*a).replace('\r\n', '\n')
|
||||
line = self.f.readline(*a).replace(b'\r\n', b'\n')
|
||||
return six.u(line)
|
||||
|
||||
def __getattr__(self, attr):
|
||||
return getattr(self.f, attr)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from eventlet import patcher
|
||||
from eventlet.green import socket
|
||||
from eventlet.support import six
|
||||
|
||||
to_patch = [('socket', socket)]
|
||||
|
||||
@@ -9,9 +10,10 @@ try:
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
patcher.inject('httplib',
|
||||
globals(),
|
||||
*to_patch)
|
||||
if six.PY2:
|
||||
patcher.inject('httplib', globals(), *to_patch)
|
||||
if six.PY3:
|
||||
patcher.inject('http.client', globals(), *to_patch)
|
||||
|
||||
if __name__ == '__main__':
|
||||
test()
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
from eventlet.support import get_errno, six
|
||||
from eventlet.hubs import trampoline
|
||||
BUFFER_SIZE = 4096
|
||||
|
||||
import array
|
||||
import errno
|
||||
import os
|
||||
import socket
|
||||
from socket import socket as _original_socket
|
||||
import socket
|
||||
import sys
|
||||
import time
|
||||
import warnings
|
||||
|
||||
from eventlet.support import get_errno, six
|
||||
from eventlet.hubs import trampoline
|
||||
BUFFER_SIZE = 4096
|
||||
|
||||
__all__ = ['GreenSocket', 'GreenPipe', 'shutdown_safe']
|
||||
|
||||
CONNECT_ERR = set((errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK))
|
||||
@@ -256,7 +256,8 @@ class GreenSocket(object):
|
||||
return ''
|
||||
else:
|
||||
raise
|
||||
trampoline(fd,
|
||||
trampoline(
|
||||
fd,
|
||||
read=True,
|
||||
timeout=self.gettimeout(),
|
||||
timeout_exc=socket.timeout("timed out"))
|
||||
@@ -287,7 +288,6 @@ class GreenSocket(object):
|
||||
# blocking socket behavior - sends all, blocks if the buffer is full
|
||||
total_sent = 0
|
||||
len_data = len(data)
|
||||
|
||||
while 1:
|
||||
try:
|
||||
total_sent += fd.send(data[total_sent:], flags)
|
||||
@@ -467,7 +467,8 @@ class GreenPipe(_fileobject):
|
||||
|
||||
def close(self):
|
||||
super(GreenPipe, self).close()
|
||||
for method in ['fileno', 'flush', 'isatty', 'next', 'read', 'readinto',
|
||||
for method in [
|
||||
'fileno', 'flush', 'isatty', 'next', 'read', 'readinto',
|
||||
'readline', 'readlines', 'seek', 'tell', 'truncate',
|
||||
'write', 'xreadlines', '__iter__', 'writelines']:
|
||||
setattr(self, method, _operationOnClosedFile)
|
||||
|
||||
@@ -4,10 +4,12 @@ from eventlet import coros, proc, api
|
||||
from eventlet.semaphore import Semaphore
|
||||
|
||||
import warnings
|
||||
warnings.warn("The pool module is deprecated. Please use the "
|
||||
warnings.warn(
|
||||
"The pool module is deprecated. Please use the "
|
||||
"eventlet.GreenPool and eventlet.GreenPile classes instead.",
|
||||
DeprecationWarning, stacklevel=2)
|
||||
|
||||
|
||||
class Pool(object):
|
||||
def __init__(self, min_size=0, max_size=4, track_events=False):
|
||||
if min_size > max_size:
|
||||
@@ -315,5 +317,3 @@ class Pool(object):
|
||||
while finished < index + 1:
|
||||
yield q.wait()
|
||||
finished += 1
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,3 @@
|
||||
import warnings
|
||||
warnings.warn("The proc module is deprecated! Please use the greenthread "
|
||||
"module, or any of the many other Eventlet cross-coroutine "
|
||||
"primitives, instead.",
|
||||
DeprecationWarning, stacklevel=2)
|
||||
|
||||
"""
|
||||
This module provides means to spawn, kill and link coroutines. Linking means
|
||||
subscribing to the coroutine's result, either in form of return value or
|
||||
@@ -63,7 +57,16 @@ coroutines and wait for all them to complete. Such a function is provided by
|
||||
this module.
|
||||
"""
|
||||
import sys
|
||||
|
||||
from eventlet import api, coros, hubs
|
||||
from eventlet.support import six
|
||||
|
||||
import warnings
|
||||
warnings.warn(
|
||||
"The proc module is deprecated! Please use the greenthread "
|
||||
"module, or any of the many other Eventlet cross-coroutine "
|
||||
"primitives, instead.",
|
||||
DeprecationWarning, stacklevel=2)
|
||||
|
||||
__all__ = ['LinkedExited',
|
||||
'LinkedFailed',
|
||||
@@ -91,11 +94,13 @@ class LinkedExited(Exception):
|
||||
msg = self.msg % self.name
|
||||
Exception.__init__(self, msg)
|
||||
|
||||
|
||||
class LinkedCompleted(LinkedExited):
|
||||
"""Raised when a linked proc finishes the execution cleanly"""
|
||||
|
||||
msg = "%r completed successfully"
|
||||
|
||||
|
||||
class LinkedFailed(LinkedExited):
|
||||
"""Raised when a linked proc dies because of unhandled exception"""
|
||||
msg = "%r failed with %s"
|
||||
@@ -104,12 +109,14 @@ class LinkedFailed(LinkedExited):
|
||||
msg = self.msg % (name, typ.__name__)
|
||||
LinkedExited.__init__(self, name, msg)
|
||||
|
||||
|
||||
class LinkedKilled(LinkedFailed):
|
||||
"""Raised when a linked proc dies because of unhandled GreenletExit
|
||||
(i.e. it was killed)
|
||||
"""
|
||||
msg = """%r was killed with %s"""
|
||||
|
||||
|
||||
def getLinkedFailed(name, typ, value=None, tb=None):
|
||||
if issubclass(typ, api.GreenletExit):
|
||||
return LinkedKilled(name, typ, value, tb)
|
||||
@@ -137,6 +144,7 @@ class Link(object):
|
||||
def __exit__(self, *args):
|
||||
self.cancel()
|
||||
|
||||
|
||||
class LinkToEvent(Link):
|
||||
|
||||
def __call__(self, source):
|
||||
@@ -147,6 +155,7 @@ class LinkToEvent(Link):
|
||||
else:
|
||||
self.listener.send_exception(*source.exc_info())
|
||||
|
||||
|
||||
class LinkToGreenlet(Link):
|
||||
|
||||
def __call__(self, source):
|
||||
@@ -155,6 +164,7 @@ class LinkToGreenlet(Link):
|
||||
else:
|
||||
self.listener.throw(getLinkedFailed(source.name, *source.exc_info()))
|
||||
|
||||
|
||||
class LinkToCallable(Link):
|
||||
|
||||
def __call__(self, source):
|
||||
@@ -401,7 +411,8 @@ class Source(object):
|
||||
self._start_send()
|
||||
|
||||
def _start_send(self):
|
||||
hubs.get_hub().schedule_call_global(0, self._do_send, self._value_links.items(), self._value_links)
|
||||
links_items = list(six.iteritems(self._value_links))
|
||||
hubs.get_hub().schedule_call_global(0, self._do_send, links_items, self._value_links)
|
||||
|
||||
def send_exception(self, *throw_args):
|
||||
assert not self.ready(), "%s has been fired already" % self
|
||||
@@ -410,7 +421,8 @@ class Source(object):
|
||||
self._start_send_exception()
|
||||
|
||||
def _start_send_exception(self):
|
||||
hubs.get_hub().schedule_call_global(0, self._do_send, self._exception_links.items(), self._exception_links)
|
||||
links_items = list(six.iteritems(self._exception_links))
|
||||
hubs.get_hub().schedule_call_global(0, self._do_send, links_items, self._exception_links)
|
||||
|
||||
def _do_send(self, links, consult):
|
||||
while links:
|
||||
@@ -603,23 +615,25 @@ class Proc(Source):
|
||||
|
||||
spawn = Proc.spawn
|
||||
|
||||
|
||||
def spawn_link(function, *args, **kwargs):
|
||||
p = spawn(function, *args, **kwargs)
|
||||
p.link()
|
||||
return p
|
||||
|
||||
|
||||
def spawn_link_value(function, *args, **kwargs):
|
||||
p = spawn(function, *args, **kwargs)
|
||||
p.link_value()
|
||||
return p
|
||||
|
||||
|
||||
def spawn_link_exception(function, *args, **kwargs):
|
||||
p = spawn(function, *args, **kwargs)
|
||||
p.link_exception()
|
||||
return p
|
||||
|
||||
|
||||
|
||||
class wrap_errors(object):
|
||||
"""Helper to make function return an exception, rather than raise it.
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import os
|
||||
import os.path
|
||||
import socket
|
||||
from unittest import TestCase, main
|
||||
import warnings
|
||||
@@ -45,7 +44,7 @@ class TestApi(TestCase):
|
||||
conn, addr = listenfd.accept()
|
||||
fd = conn.makefile(mode='w')
|
||||
conn.close()
|
||||
fd.write('hello\n')
|
||||
fd.write(b'hello\n')
|
||||
fd.close()
|
||||
finally:
|
||||
listenfd.close()
|
||||
@@ -56,7 +55,7 @@ class TestApi(TestCase):
|
||||
client = eventlet.connect(('127.0.0.1', server.getsockname()[1]))
|
||||
fd = client.makefile()
|
||||
client.close()
|
||||
assert fd.readline() == 'hello\n'
|
||||
assert fd.readline() == b'hello\n'
|
||||
|
||||
assert fd.read() == ''
|
||||
fd.close()
|
||||
@@ -68,7 +67,7 @@ class TestApi(TestCase):
|
||||
def accept_once(listenfd):
|
||||
try:
|
||||
conn, addr = listenfd.accept()
|
||||
conn.write('hello\r\n')
|
||||
conn.write(b'hello\r\n')
|
||||
greenio.shutdown_safe(conn)
|
||||
conn.close()
|
||||
finally:
|
||||
@@ -84,7 +83,7 @@ class TestApi(TestCase):
|
||||
client = util.wrap_ssl(raw_client)
|
||||
fd = socket._fileobject(client, 'rb', 8192)
|
||||
|
||||
assert fd.readline() == 'hello\r\n'
|
||||
assert fd.readline() == b'hello\r\n'
|
||||
try:
|
||||
self.assertEquals('', fd.read(10))
|
||||
except greenio.SSL.ZeroReturnError:
|
||||
@@ -96,9 +95,9 @@ class TestApi(TestCase):
|
||||
check_hub()
|
||||
|
||||
def test_001_trampoline_timeout(self):
|
||||
from eventlet import coros
|
||||
server_sock = eventlet.listen(('127.0.0.1', 0))
|
||||
bound_port = server_sock.getsockname()[1]
|
||||
|
||||
def server(sock):
|
||||
client, addr = sock.accept()
|
||||
api.sleep(0.1)
|
||||
@@ -120,6 +119,7 @@ class TestApi(TestCase):
|
||||
bound_port = server.getsockname()[1]
|
||||
|
||||
done = [False]
|
||||
|
||||
def client_closer(sock):
|
||||
while True:
|
||||
(conn, addr) = sock.accept()
|
||||
@@ -155,10 +155,10 @@ class TestApi(TestCase):
|
||||
self.assertRaises(
|
||||
ImportError, api.named, 'this_name_should_hopefully_not_exist.Foo')
|
||||
|
||||
|
||||
def test_killing_dormant(self):
|
||||
DELAY = 0.1
|
||||
state = []
|
||||
|
||||
def test():
|
||||
try:
|
||||
state.append('start')
|
||||
@@ -192,4 +192,3 @@ class Foo(object):
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
|
||||
@@ -14,15 +14,15 @@ class BackdoorTest(LimitedTestCase):
|
||||
client = socket.socket()
|
||||
client.connect(('localhost', listener.getsockname()[1]))
|
||||
f = client.makefile('rw')
|
||||
self.assert_('Python' in f.readline())
|
||||
self.assert_(b'Python' in f.readline())
|
||||
f.readline() # build info
|
||||
f.readline() # help info
|
||||
self.assert_('InteractiveConsole' in f.readline())
|
||||
self.assertEquals('>>> ', f.read(4))
|
||||
f.write('print("hi")\n')
|
||||
self.assert_(b'InteractiveConsole' in f.readline())
|
||||
self.assertEquals(b'>>> ', f.read(4))
|
||||
f.write(b'print("hi")\n')
|
||||
f.flush()
|
||||
self.assertEquals('hi\n', f.readline())
|
||||
self.assertEquals('>>> ', f.read(4))
|
||||
self.assertEquals(b'hi\n', f.readline())
|
||||
self.assertEquals(b'>>> ', f.read(4))
|
||||
f.close()
|
||||
client.close()
|
||||
serv.kill()
|
||||
|
||||
@@ -37,25 +37,25 @@ class SSLTest(LimitedTestCase):
|
||||
def test_duplex_response(self):
|
||||
def serve(listener):
|
||||
sock, addr = listener.accept()
|
||||
stuff = sock.read(8192)
|
||||
sock.write('response')
|
||||
sock.read(8192)
|
||||
sock.write(b'response')
|
||||
|
||||
sock = listen_ssl_socket()
|
||||
|
||||
server_coro = eventlet.spawn(serve, sock)
|
||||
|
||||
client = util.wrap_ssl(eventlet.connect(('127.0.0.1', sock.getsockname()[1])))
|
||||
client.write('line 1\r\nline 2\r\n\r\n')
|
||||
self.assertEquals(client.read(8192), 'response')
|
||||
client.write(b'line 1\r\nline 2\r\n\r\n')
|
||||
self.assertEquals(client.read(8192), b'response')
|
||||
server_coro.wait()
|
||||
|
||||
@skip_if_no_ssl
|
||||
def test_ssl_close(self):
|
||||
def serve(listener):
|
||||
sock, addr = listener.accept()
|
||||
stuff = sock.read(8192)
|
||||
sock.read(8192)
|
||||
try:
|
||||
self.assertEquals("", sock.read(8192))
|
||||
self.assertEquals(b"", sock.read(8192))
|
||||
except greenio.SSL.ZeroReturnError:
|
||||
pass
|
||||
|
||||
@@ -65,7 +65,7 @@ class SSLTest(LimitedTestCase):
|
||||
|
||||
raw_client = eventlet.connect(('127.0.0.1', sock.getsockname()[1]))
|
||||
client = util.wrap_ssl(raw_client)
|
||||
client.write('X')
|
||||
client.write(b'X')
|
||||
greenio.shutdown_safe(client)
|
||||
client.close()
|
||||
server_coro.wait()
|
||||
@@ -74,14 +74,14 @@ class SSLTest(LimitedTestCase):
|
||||
def test_ssl_connect(self):
|
||||
def serve(listener):
|
||||
sock, addr = listener.accept()
|
||||
stuff = sock.read(8192)
|
||||
sock.read(8192)
|
||||
sock = listen_ssl_socket()
|
||||
server_coro = eventlet.spawn(serve, sock)
|
||||
|
||||
raw_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
ssl_client = util.wrap_ssl(raw_client)
|
||||
ssl_client.connect(('127.0.0.1', sock.getsockname()[1]))
|
||||
ssl_client.write('abc')
|
||||
ssl_client.write(b'abc')
|
||||
greenio.shutdown_safe(ssl_client)
|
||||
ssl_client.close()
|
||||
server_coro.wait()
|
||||
@@ -90,24 +90,24 @@ class SSLTest(LimitedTestCase):
|
||||
def test_ssl_unwrap(self):
|
||||
def serve():
|
||||
sock, addr = listener.accept()
|
||||
self.assertEquals(sock.recv(6), 'before')
|
||||
self.assertEquals(sock.recv(6), b'before')
|
||||
sock_ssl = util.wrap_ssl(sock, certificate_file, private_key_file,
|
||||
server_side=True)
|
||||
sock_ssl.do_handshake()
|
||||
self.assertEquals(sock_ssl.read(6), 'during')
|
||||
self.assertEquals(sock_ssl.read(6), b'during')
|
||||
sock2 = sock_ssl.unwrap()
|
||||
self.assertEquals(sock2.recv(5), 'after')
|
||||
self.assertEquals(sock2.recv(5), b'after')
|
||||
sock2.close()
|
||||
|
||||
listener = eventlet.listen(('127.0.0.1', 0))
|
||||
server_coro = eventlet.spawn(serve)
|
||||
client = eventlet.connect((listener.getsockname()))
|
||||
client.send('before')
|
||||
client.send(b'before')
|
||||
client_ssl = util.wrap_ssl(client)
|
||||
client_ssl.do_handshake()
|
||||
client_ssl.write('during')
|
||||
client_ssl.write(b'during')
|
||||
client2 = client_ssl.unwrap()
|
||||
client2.send('after')
|
||||
client2.send(b'after')
|
||||
server_coro.wait()
|
||||
|
||||
@skip_if_no_ssl
|
||||
@@ -131,11 +131,11 @@ class SSLTest(LimitedTestCase):
|
||||
def serve(listener):
|
||||
conn, _ = listener.accept()
|
||||
conn.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, BUFFER_SIZE)
|
||||
self.assertEqual(conn.read(8), 'request')
|
||||
conn.write('response')
|
||||
self.assertEqual(conn.read(8), b'request')
|
||||
conn.write(b'response')
|
||||
|
||||
stage_1.wait()
|
||||
conn.sendall('x' * SENDALL_SIZE)
|
||||
conn.sendall(b'x' * SENDALL_SIZE)
|
||||
|
||||
server_sock = listen_ssl_socket()
|
||||
server_coro = eventlet.spawn(serve, server_sock)
|
||||
@@ -143,8 +143,8 @@ class SSLTest(LimitedTestCase):
|
||||
client_sock = eventlet.connect(server_sock.getsockname())
|
||||
client_sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFFER_SIZE)
|
||||
client = util.wrap_ssl(client_sock)
|
||||
client.write('request')
|
||||
self.assertEqual(client.read(8), 'response')
|
||||
client.write(b'request')
|
||||
self.assertEqual(client.read(8), b'response')
|
||||
stage_1.send()
|
||||
|
||||
check_idle_cpu_usage(0.2, 0.1)
|
||||
@@ -154,14 +154,14 @@ class SSLTest(LimitedTestCase):
|
||||
def test_greensslobject(self):
|
||||
def serve(listener):
|
||||
sock, addr = listener.accept()
|
||||
sock.write('content')
|
||||
sock.write(b'content')
|
||||
greenio.shutdown_safe(sock)
|
||||
sock.close()
|
||||
listener = listen_ssl_socket(('', 0))
|
||||
killer = eventlet.spawn(serve, listener)
|
||||
eventlet.spawn(serve, listener)
|
||||
client = ssl(eventlet.connect(('localhost', listener.getsockname()[1])))
|
||||
self.assertEquals(client.read(1024), 'content')
|
||||
self.assertEquals(client.read(1024), '')
|
||||
self.assertEquals(client.read(1024), b'content')
|
||||
self.assertEquals(client.read(1024), b'')
|
||||
|
||||
@skip_if_no_ssl
|
||||
def test_regression_gh_17(self):
|
||||
@@ -170,13 +170,13 @@ class SSLTest(LimitedTestCase):
|
||||
|
||||
# to simulate condition mentioned in GH-17
|
||||
sock._sslobj = None
|
||||
sock.sendall('some data')
|
||||
sock.sendall(b'some data')
|
||||
greenio.shutdown_safe(sock)
|
||||
sock.close()
|
||||
|
||||
listener = listen_ssl_socket(('', 0))
|
||||
killer = eventlet.spawn(serve, listener)
|
||||
client = ssl(eventlet.connect(('localhost', listener.getsockname()[1])))
|
||||
eventlet.spawn(serve, listener)
|
||||
ssl(eventlet.connect(('localhost', listener.getsockname()[1])))
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
@@ -33,9 +33,9 @@ def handle_request(s, raise_on_timeout):
|
||||
return
|
||||
#print('handle_request - accepted')
|
||||
res = conn.recv(100)
|
||||
assert res == 'hello', repr(res)
|
||||
assert res == b'hello', repr(res)
|
||||
#print('handle_request - recvd %r' % res)
|
||||
res = conn.send('bye')
|
||||
res = conn.send(b'bye')
|
||||
#print('handle_request - sent %r' % res)
|
||||
#print('handle_request - conn refcount: %s' % sys.getrefcount(conn))
|
||||
#conn.close()
|
||||
@@ -46,10 +46,10 @@ def make_request(port):
|
||||
s = socket.socket()
|
||||
s.connect(('localhost', port))
|
||||
#print('make_request - connected')
|
||||
res = s.send('hello')
|
||||
res = s.send(b'hello')
|
||||
#print('make_request - sent %s' % res)
|
||||
res = s.recv(100)
|
||||
assert res == 'bye', repr(res)
|
||||
assert res == b'bye', repr(res)
|
||||
#print('make_request - recvd %r' % res)
|
||||
#s.close()
|
||||
|
||||
@@ -74,7 +74,7 @@ def run_and_check(run_client):
|
||||
for x in gc.get_referrers(w()):
|
||||
print(pformat(x))
|
||||
for y in gc.get_referrers(x):
|
||||
print('-', pformat(y))
|
||||
print('- {0}'.format(pformat(y)))
|
||||
raise AssertionError('server should be dead by now')
|
||||
|
||||
|
||||
@@ -82,10 +82,11 @@ def test_clean_exit():
|
||||
run_and_check(True)
|
||||
run_and_check(True)
|
||||
|
||||
|
||||
def test_timeout_exit():
|
||||
run_and_check(False)
|
||||
run_and_check(False)
|
||||
|
||||
|
||||
if __name__=='__main__':
|
||||
unittest.main()
|
||||
|
||||
|
||||
3
tox.ini
3
tox.ini
@@ -38,11 +38,14 @@ commands =
|
||||
eventlet/green/__init__.py \
|
||||
eventlet/green/_socket_nodns.py \
|
||||
eventlet/green/ftplib.py \
|
||||
eventlet/green/httplib.py \
|
||||
eventlet/green/OpenSSL/__init__.py \
|
||||
eventlet/green/subprocess.py \
|
||||
eventlet/green/time.py \
|
||||
eventlet/green/urllib.py \
|
||||
eventlet/hubs/__init__.py \
|
||||
eventlet/hubs/timer.py \
|
||||
eventlet/pool.py \
|
||||
eventlet/semaphore.py \
|
||||
eventlet/support/__init__.py \
|
||||
tests/__init__.py \
|
||||
|
||||
Reference in New Issue
Block a user