Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-eventlet for openSUSE:Factory
checked in at 2021-11-21 23:51:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-eventlet (Old)
and /work/SRC/openSUSE:Factory/.python-eventlet.new.1895 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-eventlet"
Sun Nov 21 23:51:36 2021 rev:38 rq:931441 version:0.32.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-eventlet/python-eventlet.changes
2021-04-01 14:15:58.947865603 +0200
+++
/work/SRC/openSUSE:Factory/.python-eventlet.new.1895/python-eventlet.changes
2021-11-21 23:51:45.814333891 +0100
@@ -1,0 +2,15 @@
+Sun Nov 7 21:12:37 UTC 2021 - Dirk M??ller <[email protected]>
+
+- update to 0.32.0:
+ * greendns: compatibility with dnspython v2
+ * green.ssl: wrap_socket now accepts argument `ciphers`
+ * websocket: control frames are now always uncompressed per RFC 7692
+ * ssl: py3.6 using client certificates raised ValueError: check_hostname
needs server_hostname argument
+ * IMPORTANT: websocket: Limit maximum uncompressed frame length to 8MiB
+ * wsgi: websocket ALREADY_HANDLED flag on corolocal
+ * green.ssl: Set suppress_ragged_eofs default based on SSLSocket defaults
+ * greenio: socket.connect_ex returned None instead of 0 on success
+ * Use _imp instead of deprecated imp
+- drop pr_639.patch, merged upstream
+
+-------------------------------------------------------------------
Old:
----
eventlet-0.30.2.tar.gz
pr_639.patch
New:
----
eventlet-0.32.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-eventlet.spec ++++++
--- /var/tmp/diff_new_pack.12tFtF/_old 2021-11-21 23:51:46.438331880 +0100
+++ /var/tmp/diff_new_pack.12tFtF/_new 2021-11-21 23:51:46.442331867 +0100
@@ -18,7 +18,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-eventlet
-Version: 0.30.2
+Version: 0.32.0
Release: 0
Summary: Concurrent networking library for Python
License: MIT
@@ -30,8 +30,6 @@
Patch0: remove_nose.patch
# PATCH-FIX-UPSTREAM newdnspython.patch [email protected] -- patch is from
gh#rthalley/dnspython#519, discussion in gh#eventlet/eventlet#638
Patch1: newdnspython.patch
-# PATCH-FEATURE-UPSTREAM pr_639.patch gh#eventlet/eventlet#639 [email protected]
-Patch2: pr_639.patch
# Really remove the dependency on nose
Patch3: remove_nose_part_2.patch
BuildRequires: %{python_module setuptools}
@@ -46,7 +44,9 @@
BuildRequires: sysconfig-netconfig
BuildRequires: %{python_module dnspython >= 1.15.0}
BuildRequires: %{python_module greenlet >= 0.3}
+%if 0%{?suse_version} >= 1550
BuildRequires: %{python_module pyOpenSSL}
+%endif
BuildRequires: %{python_module pytest}
BuildRequires: %{python_module pyzmq}
BuildRequires: %{python_module six >= 1.10.0}
++++++ eventlet-0.30.2.tar.gz -> eventlet-0.32.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/NEWS new/eventlet-0.32.0/NEWS
--- old/eventlet-0.30.2/NEWS 2021-03-03 12:41:35.000000000 +0100
+++ new/eventlet-0.32.0/NEWS 2021-09-01 12:49:47.000000000 +0200
@@ -1,3 +1,24 @@
+0.32.0
+======
+* greendns: compatibility with dnspython v2
https://github.com/eventlet/eventlet/pull/722
+* green.ssl: wrap_socket now accepts argument `ciphers`
https://github.com/eventlet/eventlet/pull/718
+* websocket: control frames are now always uncompressed per RFC 7692; Thanks
to Onno Kortmann
+
+0.31.1
+======
+* ssl: py3.6 using client certificates raised ValueError: check_hostname needs
server_hostname argument https://github.com/eventlet/eventlet/pull/705
+
+0.31.0
+======
+* IMPORTANT: websocket: Limit maximum uncompressed frame length to 8MiB
https://github.com/eventlet/eventlet/security/advisories/GHSA-9p9m-jm8w-94p2
+
+0.30.3
+======
+* wsgi: websocket ALREADY_HANDLED flag on corolocal
+* green.ssl: Set suppress_ragged_eofs default based on SSLSocket defaults
+* greenio: socket.connect_ex returned None instead of 0 on success
+* Use _imp instead of deprecated imp
+
0.30.2
======
* greendns: patch ssl to fix RecursionError on SSLContext.options.__set__
https://github.com/eventlet/eventlet/issues/677
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/PKG-INFO new/eventlet-0.32.0/PKG-INFO
--- old/eventlet-0.30.2/PKG-INFO 2021-03-03 12:42:28.000000000 +0100
+++ new/eventlet-0.32.0/PKG-INFO 2021-09-01 12:54:37.135779000 +0200
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 2.1
Name: eventlet
-Version: 0.30.2
+Version: 0.32.0
Summary: Highly concurrent networking library
Home-page: http://eventlet.net
Author: Linden Lab
@@ -81,8 +81,8 @@
.. image:: https://img.shields.io/pypi/v/eventlet
:target: https://pypi.org/project/eventlet/
- .. image:: https://travis-ci.org/eventlet/eventlet.svg?branch=master
- :target: https://travis-ci.org/eventlet/eventlet
+ .. image::
https://img.shields.io/github/workflow/status/eventlet/eventlet/test/master
+ :target:
https://github.com/eventlet/eventlet/actions?query=workflow%3Atest+branch%3Amaster
.. image::
https://codecov.io/gh/eventlet/eventlet/branch/master/graph/badge.svg
:target: https://codecov.io/gh/eventlet/eventlet
@@ -100,6 +100,8 @@
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python
Classifier: Topic :: Internet
Classifier: Topic :: Software Development :: Libraries :: Python Modules
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/README.rst
new/eventlet-0.32.0/README.rst
--- old/eventlet-0.30.2/README.rst 2021-02-02 10:04:54.000000000 +0100
+++ new/eventlet-0.32.0/README.rst 2021-09-01 12:49:47.000000000 +0200
@@ -73,8 +73,8 @@
.. image:: https://img.shields.io/pypi/v/eventlet
:target: https://pypi.org/project/eventlet/
-.. image:: https://travis-ci.org/eventlet/eventlet.svg?branch=master
- :target: https://travis-ci.org/eventlet/eventlet
+.. image::
https://img.shields.io/github/workflow/status/eventlet/eventlet/test/master
+ :target:
https://github.com/eventlet/eventlet/actions?query=workflow%3Atest+branch%3Amaster
.. image::
https://codecov.io/gh/eventlet/eventlet/branch/master/graph/badge.svg
:target: https://codecov.io/gh/eventlet/eventlet
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/eventlet/__init__.py
new/eventlet-0.32.0/eventlet/__init__.py
--- old/eventlet-0.30.2/eventlet/__init__.py 2021-03-03 12:39:52.000000000
+0100
+++ new/eventlet-0.32.0/eventlet/__init__.py 2021-09-01 12:49:47.000000000
+0200
@@ -8,7 +8,7 @@
DeprecationWarning,
)
-version_info = (0, 30, 2)
+version_info = (0, 32, 0)
__version__ = '.'.join(map(str, version_info))
# This is to make Debian packaging easier, it ignores import
# errors of greenlet so that the packager can still at least
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/eventlet/green/ssl.py
new/eventlet-0.32.0/eventlet/green/ssl.py
--- old/eventlet-0.30.2/eventlet/green/ssl.py 2021-02-02 10:04:54.000000000
+0100
+++ new/eventlet-0.32.0/eventlet/green/ssl.py 2021-09-01 12:49:47.000000000
+0200
@@ -70,7 +70,7 @@
sock=sock.fd,
server_side=server_side,
do_handshake_on_connect=False,
- suppress_ragged_eofs=kw.get('suppress_ragged_eofs'),
+ suppress_ragged_eofs=kw.get('suppress_ragged_eofs',
True),
server_hostname=kw.get('server_hostname'),
context=context,
session=kw.get('session'),
@@ -85,6 +85,7 @@
ssl_version=ssl_version,
ca_certs=ca_certs,
do_handshake_on_connect=False,
+ ciphers=kw.get('ciphers'),
)
ret.keyfile = keyfile
ret.certfile = certfile
@@ -364,7 +365,7 @@
sslobj = self._context._wrap_socket(self._sock, server_side,
ssl_sock=self)
else:
context = self.context if PY33 else self._context
- sslobj = context._wrap_socket(self, server_side)
+ sslobj = context._wrap_socket(self, server_side,
server_hostname=self.server_hostname)
else:
sslobj = sslwrap(self._sock, server_side, self.keyfile,
self.certfile,
self.cert_reqs, self.ssl_version,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/eventlet/greenio/base.py
new/eventlet-0.32.0/eventlet/greenio/base.py
--- old/eventlet-0.30.2/eventlet/greenio/base.py 2021-02-02
10:04:54.000000000 +0100
+++ new/eventlet-0.32.0/eventlet/greenio/base.py 2021-09-01
12:49:47.000000000 +0200
@@ -279,6 +279,7 @@
return get_errno(ex)
except IOClosed:
return errno.EBADFD
+ return 0
else:
end = time.time() + self.gettimeout()
timeout_exc = socket.timeout(errno.EAGAIN)
@@ -295,6 +296,7 @@
return get_errno(ex)
except IOClosed:
return errno.EBADFD
+ return 0
def dup(self, *args, **kw):
sock = self.fd.dup(*args, **kw)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/eventlet/patcher.py
new/eventlet-0.32.0/eventlet/patcher.py
--- old/eventlet-0.30.2/eventlet/patcher.py 2021-02-02 10:04:54.000000000
+0100
+++ new/eventlet-0.32.0/eventlet/patcher.py 2021-09-01 12:49:47.000000000
+0200
@@ -1,4 +1,7 @@
-import imp
+try:
+ import _imp as imp
+except ImportError:
+ import imp
import sys
try:
# Only for this purpose, it's irrelevant if `os` was already patched.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/eventlet/support/greendns.py
new/eventlet-0.32.0/eventlet/support/greendns.py
--- old/eventlet-0.30.2/eventlet/support/greendns.py 2021-03-03
12:39:36.000000000 +0100
+++ new/eventlet-0.32.0/eventlet/support/greendns.py 2021-09-01
12:49:47.000000000 +0200
@@ -120,6 +120,16 @@
return is_ipv4_addr(host) or is_ipv6_addr(host)
+# NOTE(ralonsoh): in dnspython v2.0.0, "_compute_expiration" was replaced
+# by "_compute_times".
+if hasattr(dns.query, '_compute_expiration'):
+ def compute_expiration(query, timeout):
+ return query._compute_expiration(timeout)
+else:
+ def compute_expiration(query, timeout):
+ return query._compute_times(timeout)[1]
+
+
class HostsAnswer(dns.resolver.Answer):
"""Answer class for HostsResolver object"""
@@ -660,8 +670,21 @@
raise dns.exception.Timeout
+# Test if raise_on_truncation is an argument we should handle.
+# It was newly added in dnspython 2.0
+try:
+ dns.message.from_wire("", raise_on_truncation=True)
+except dns.message.ShortHeader:
+ _handle_raise_on_truncation = True
+except TypeError:
+ # Argument error, there is no argument "raise_on_truncation"
+ _handle_raise_on_truncation = False
+
+
def udp(q, where, timeout=DNS_QUERY_TIMEOUT, port=53,
- af=None, source=None, source_port=0, ignore_unexpected=False):
+ af=None, source=None, source_port=0, ignore_unexpected=False,
+ one_rr_per_rrset=False, ignore_trailing=False,
+ raise_on_truncation=False, sock=None):
"""coro friendly replacement for dns.query.udp
Return the response obtained after sending a query via UDP.
@@ -686,7 +709,21 @@
@type source_port: int
@param ignore_unexpected: If True, ignore responses from unexpected
sources. The default is False.
- @type ignore_unexpected: bool"""
+ @type ignore_unexpected: bool
+ @param one_rr_per_rrset: If True, put each RR into its own
+ RRset.
+ @type one_rr_per_rrset: bool
+ @param ignore_trailing: If True, ignore trailing
+ junk at end of the received message.
+ @type ignore_trailing: bool
+ @param raise_on_truncation: If True, raise an exception if
+ the TC bit is set.
+ @type raise_on_truncation: bool
+ @param sock: the socket to use for the
+ query. If None, the default, a socket is created. Note that
+ if a socket is provided, it must be a nonblocking datagram socket,
+ and the source and source_port are ignored.
+ @type sock: socket.socket | None"""
wire = q.to_wire()
if af is None:
@@ -708,10 +745,13 @@
if source is not None:
source = (source, source_port, 0, 0)
- s = socket.socket(af, socket.SOCK_DGRAM)
+ if sock:
+ s = sock
+ else:
+ s = socket.socket(af, socket.SOCK_DGRAM)
s.settimeout(timeout)
try:
- expiration = dns.query._compute_expiration(timeout)
+ expiration = compute_expiration(dns.query, timeout)
if source is not None:
s.bind(source)
while True:
@@ -756,14 +796,23 @@
finally:
s.close()
- r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac)
+ if _handle_raise_on_truncation:
+ r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac,
+ one_rr_per_rrset=one_rr_per_rrset,
+ ignore_trailing=ignore_trailing,
+ raise_on_truncation=raise_on_truncation)
+ else:
+ r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac,
+ one_rr_per_rrset=one_rr_per_rrset,
+ ignore_trailing=ignore_trailing)
if not q.is_response(r):
raise dns.query.BadResponse()
return r
def tcp(q, where, timeout=DNS_QUERY_TIMEOUT, port=53,
- af=None, source=None, source_port=0):
+ af=None, source=None, source_port=0,
+ one_rr_per_rrset=False, ignore_trailing=False, sock=None):
"""coro friendly replacement for dns.query.tcp
Return the response obtained after sending a query via TCP.
@@ -785,7 +834,19 @@
@type source: string
@param source_port: The port from which to send the message.
The default is 0.
- @type source_port: int"""
+ @type source_port: int
+ @type ignore_unexpected: bool
+ @param one_rr_per_rrset: If True, put each RR into its own
+ RRset.
+ @type one_rr_per_rrset: bool
+ @param ignore_trailing: If True, ignore trailing
+ junk at end of the received message.
+ @type ignore_trailing: bool
+ @param sock: the socket to use for the
+ query. If None, the default, a socket is created. Note that
+ if a socket is provided, it must be a nonblocking datagram socket,
+ and the source and source_port are ignored.
+ @type sock: socket.socket | None"""
wire = q.to_wire()
if af is None:
@@ -801,10 +862,13 @@
destination = (where, port, 0, 0)
if source is not None:
source = (source, source_port, 0, 0)
- s = socket.socket(af, socket.SOCK_STREAM)
+ if sock:
+ s = sock
+ else:
+ s = socket.socket(af, socket.SOCK_STREAM)
s.settimeout(timeout)
try:
- expiration = dns.query._compute_expiration(timeout)
+ expiration = compute_expiration(dns.query, timeout)
if source is not None:
s.bind(source)
while True:
@@ -829,7 +893,9 @@
wire = bytes(_net_read(s, l, expiration))
finally:
s.close()
- r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac)
+ r = dns.message.from_wire(wire, keyring=q.keyring, request_mac=q.mac,
+ one_rr_per_rrset=one_rr_per_rrset,
+ ignore_trailing=ignore_trailing)
if not q.is_response(r):
raise dns.query.BadResponse()
return r
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/eventlet/tpool.py
new/eventlet-0.32.0/eventlet/tpool.py
--- old/eventlet-0.30.2/eventlet/tpool.py 2021-02-02 10:04:54.000000000
+0100
+++ new/eventlet-0.32.0/eventlet/tpool.py 2021-09-01 12:49:47.000000000
+0200
@@ -14,7 +14,10 @@
# limitations under the License.
import atexit
-import imp
+try:
+ import _imp as imp
+except ImportError:
+ import imp
import os
import sys
import traceback
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/eventlet/websocket.py
new/eventlet-0.32.0/eventlet/websocket.py
--- old/eventlet-0.30.2/eventlet/websocket.py 2021-02-02 10:04:54.000000000
+0100
+++ new/eventlet-0.32.0/eventlet/websocket.py 2021-09-01 12:49:47.000000000
+0200
@@ -38,6 +38,7 @@
break
ACCEPTABLE_CLIENT_ERRORS = set((errno.ECONNRESET, errno.EPIPE))
+DEFAULT_MAX_FRAME_LENGTH = 8 << 20
__all__ = ["WebSocketWSGI", "WebSocket"]
PROTOCOL_GUID = b'258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
@@ -75,14 +76,20 @@
:class:`WebSocket`. To close the socket, simply return from the
function. Note that the server will log the websocket request at
the time of closure.
+
+ An optional argument max_frame_length can be given, which will set the
+ maximum incoming *uncompressed* payload length of a frame. By default, this
+ is set to 8MiB. Note that excessive values here might create a DOS attack
+ vector.
"""
- def __init__(self, handler):
+ def __init__(self, handler, max_frame_length=DEFAULT_MAX_FRAME_LENGTH):
self.handler = handler
self.protocol_version = None
self.support_legacy_versions = True
self.supported_protocols = []
self.origin_checker = None
+ self.max_frame_length = max_frame_length
@classmethod
def configured(cls,
@@ -135,7 +142,8 @@
ws._send_closing_frame(True)
# use this undocumented feature of eventlet.wsgi to ensure that it
# doesn't barf on the fact that we didn't call start_response
- return wsgi.ALREADY_HANDLED
+ wsgi.WSGI_LOCAL.already_handled = True
+ return []
def _handle_legacy_request(self, environ):
if 'eventlet.input' in environ:
@@ -323,7 +331,8 @@
sock.sendall(b'\r\n'.join(handshake_reply) + b'\r\n\r\n')
return RFC6455WebSocket(sock, environ, self.protocol_version,
protocol=negotiated_protocol,
- extensions=parsed_extensions)
+ extensions=parsed_extensions,
+ max_frame_length=self.max_frame_length)
def _extract_number(self, value):
"""
@@ -502,7 +511,8 @@
class RFC6455WebSocket(WebSocket):
- def __init__(self, sock, environ, version=13, protocol=None, client=False,
extensions=None):
+ def __init__(self, sock, environ, version=13, protocol=None, client=False,
extensions=None,
+ max_frame_length=DEFAULT_MAX_FRAME_LENGTH):
super(RFC6455WebSocket, self).__init__(sock, environ, version)
self.iterator = self._iter_frames()
self.client = client
@@ -511,6 +521,8 @@
self._deflate_enc = None
self._deflate_dec = None
+ self.max_frame_length = max_frame_length
+ self._remote_close_data = None
class UTF8Decoder(object):
def __init__(self):
@@ -582,12 +594,13 @@
return data
class Message(object):
- def __init__(self, opcode, decoder=None, decompressor=None):
+ def __init__(self, opcode, max_frame_length, decoder=None,
decompressor=None):
self.decoder = decoder
self.data = []
self.finished = False
self.opcode = opcode
self.decompressor = decompressor
+ self.max_frame_length = max_frame_length
def push(self, data, final=False):
self.finished = final
@@ -596,7 +609,12 @@
def getvalue(self):
data = b"".join(self.data)
if not self.opcode & 8 and self.decompressor:
- data = self.decompressor.decompress(data + b'\x00\x00\xff\xff')
+ data = self.decompressor.decompress(data +
b"\x00\x00\xff\xff", self.max_frame_length)
+ if self.decompressor.unconsumed_tail:
+ raise FailedConnectionError(
+ 1009,
+ "Incoming compressed frame exceeds length limit of {}
bytes.".format(self.max_frame_length))
+
if self.decoder:
data = self.decoder.decode(data, self.finished)
return data
@@ -610,6 +628,7 @@
def _handle_control_frame(self, opcode, data):
if opcode == 8: # connection close
+ self._remote_close_data = data
if not data:
status = 1000
elif len(data) > 1:
@@ -709,13 +728,17 @@
length = struct.unpack('!H', recv(2))[0]
elif length == 127:
length = struct.unpack('!Q', recv(8))[0]
+
+ if length > self.max_frame_length:
+ raise FailedConnectionError(1009, "Incoming frame of {} bytes is
above length limit of {} bytes.".format(
+ length, self.max_frame_length))
if masked:
mask = struct.unpack('!BBBB', recv(4))
received = 0
if not message or opcode & 8:
decoder = self.UTF8Decoder() if opcode == 1 else None
decompressor = self._get_permessage_deflate_dec(rsv1)
- message = self.Message(opcode, decoder=decoder,
decompressor=decompressor)
+ message = self.Message(opcode, self.max_frame_length,
decoder=decoder, decompressor=decompressor)
if not length:
message.push(b'', final=finished)
else:
@@ -743,7 +766,17 @@
compress_bit = 0
compressor = self._get_permessage_deflate_enc()
- if message and compressor:
+ # Control frames are identified by opcodes where the most significant
+ # bit of the opcode is 1. Currently defined opcodes for control frames
+ # include 0x8 (Close), 0x9 (Ping), and 0xA (Pong). Opcodes 0xB-0xF are
+ # reserved for further control frames yet to be defined.
+ # https://datatracker.ietf.org/doc/html/rfc6455#section-5.5
+ is_control_frame = (control_code or 0) & 8
+ # An endpoint MUST NOT set the "Per-Message Compressed" bit of control
+ # frames and non-first fragments of a data message. An endpoint
+ # receiving such a frame MUST _Fail the WebSocket Connection_.
+ # https://datatracker.ietf.org/doc/html/rfc7692#section-6.1
+ if message and compressor and not is_control_frame:
message = compressor.compress(message)
message += compressor.flush(zlib.Z_SYNC_FLUSH)
assert message[-4:] == b"\x00\x00\xff\xff"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/eventlet/wsgi.py
new/eventlet-0.32.0/eventlet/wsgi.py
--- old/eventlet-0.30.2/eventlet/wsgi.py 2021-02-02 10:04:54.000000000
+0100
+++ new/eventlet-0.32.0/eventlet/wsgi.py 2021-09-01 12:49:47.000000000
+0200
@@ -9,6 +9,7 @@
import eventlet
from eventlet import greenio
from eventlet import support
+from eventlet.corolocal import local
from eventlet.green import BaseHTTPServer
from eventlet.green import socket
import six
@@ -69,19 +70,7 @@
pass
-# special flag return value for apps
-class _AlreadyHandled(object):
-
- def __iter__(self):
- return self
-
- def next(self):
- raise StopIteration
-
- __next__ = next
-
-
-ALREADY_HANDLED = _AlreadyHandled()
+WSGI_LOCAL = local()
class Input(object):
@@ -570,14 +559,12 @@
try:
try:
+ WSGI_LOCAL.already_handled = False
result = self.application(self.environ, start_response)
- if (isinstance(result, _AlreadyHandled)
- or isinstance(getattr(result, '_obj', None),
_AlreadyHandled)):
- self.close_connection = 1
- return
# Set content-length if possible
- if not headers_sent and hasattr(result, '__len__') and \
+ if headers_set and \
+ not headers_sent and hasattr(result, '__len__') and \
'Content-Length' not in [h for h, _v in
headers_set[1]]:
headers_set[1].append(('Content-Length', str(sum(map(len,
result)))))
@@ -599,6 +586,9 @@
towrite = []
just_written_size = towrite_size
towrite_size = 0
+ if WSGI_LOCAL.already_handled:
+ self.close_connection = 1
+ return
if towrite:
just_written_size = towrite_size
write(b''.join(towrite))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/eventlet/zipkin/client.py
new/eventlet-0.32.0/eventlet/zipkin/client.py
--- old/eventlet-0.30.2/eventlet/zipkin/client.py 2021-02-02
10:04:54.000000000 +0100
+++ new/eventlet-0.32.0/eventlet/zipkin/client.py 2021-09-01
12:49:47.000000000 +0200
@@ -15,7 +15,7 @@
def __init__(self, host='127.0.0.1', port=9410):
"""
- :param host: zipkin collector IP addoress (default '127.0.0.1')
+ :param host: zipkin collector IP address (default '127.0.0.1')
:param port: zipkin collector port (default 9410)
"""
self.host = host
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/eventlet.egg-info/PKG-INFO
new/eventlet-0.32.0/eventlet.egg-info/PKG-INFO
--- old/eventlet-0.30.2/eventlet.egg-info/PKG-INFO 2021-03-03
12:42:27.000000000 +0100
+++ new/eventlet-0.32.0/eventlet.egg-info/PKG-INFO 2021-09-01
12:54:36.000000000 +0200
@@ -1,6 +1,6 @@
-Metadata-Version: 1.1
+Metadata-Version: 2.1
Name: eventlet
-Version: 0.30.2
+Version: 0.32.0
Summary: Highly concurrent networking library
Home-page: http://eventlet.net
Author: Linden Lab
@@ -81,8 +81,8 @@
.. image:: https://img.shields.io/pypi/v/eventlet
:target: https://pypi.org/project/eventlet/
- .. image:: https://travis-ci.org/eventlet/eventlet.svg?branch=master
- :target: https://travis-ci.org/eventlet/eventlet
+ .. image::
https://img.shields.io/github/workflow/status/eventlet/eventlet/test/master
+ :target:
https://github.com/eventlet/eventlet/actions?query=workflow%3Atest+branch%3Amaster
.. image::
https://codecov.io/gh/eventlet/eventlet/branch/master/graph/badge.svg
:target: https://codecov.io/gh/eventlet/eventlet
@@ -100,6 +100,8 @@
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python
Classifier: Topic :: Internet
Classifier: Topic :: Software Development :: Libraries :: Python Modules
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/eventlet.egg-info/requires.txt
new/eventlet-0.32.0/eventlet.egg-info/requires.txt
--- old/eventlet-0.30.2/eventlet.egg-info/requires.txt 2021-03-03
12:42:27.000000000 +0100
+++ new/eventlet-0.32.0/eventlet.egg-info/requires.txt 2021-09-01
12:54:36.000000000 +0200
@@ -1,4 +1,4 @@
-dnspython<2.0.0,>=1.15.0
+dnspython>=1.15.0
greenlet>=0.3
six>=1.10.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/setup.py new/eventlet-0.32.0/setup.py
--- old/eventlet-0.30.2/setup.py 2021-02-02 10:04:54.000000000 +0100
+++ new/eventlet-0.32.0/setup.py 2021-09-01 12:49:47.000000000 +0200
@@ -15,7 +15,7 @@
url='http://eventlet.net',
packages=setuptools.find_packages(exclude=['benchmarks', 'tests',
'tests.*']),
install_requires=(
- 'dnspython >= 1.15.0, < 2.0.0',
+ 'dnspython >= 1.15.0',
'greenlet >= 0.3',
'monotonic >= 1.4;python_version<"3.5"',
'six >= 1.10.0',
@@ -41,6 +41,8 @@
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
+ "Programming Language :: Python :: 3.8",
+ "Programming Language :: Python :: 3.9",
"Programming Language :: Python",
"Topic :: Internet",
"Topic :: Software Development :: Libraries :: Python Modules",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/tests/__init__.py
new/eventlet-0.32.0/tests/__init__.py
--- old/eventlet-0.30.2/tests/__init__.py 2021-02-02 10:04:54.000000000
+0100
+++ new/eventlet-0.32.0/tests/__init__.py 2021-09-01 12:49:47.000000000
+0200
@@ -232,10 +232,10 @@
utime = r2.ru_utime - r1.ru_utime
stime = r2.ru_stime - r1.ru_stime
- # This check is reliably unreliable on Travis, presumably because of CPU
+ # This check is reliably unreliable on Travis/Github Actions, presumably
because of CPU
# resources being quite restricted by the build environment. The workaround
# is to apply an arbitrary factor that should be enough to make it work
nicely.
- if os.environ.get('TRAVIS') == 'true':
+ if os.environ.get('CI') == 'true':
allowed_part *= 5
assert utime + stime < duration * allowed_part, \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/tests/greendns_test.py
new/eventlet-0.32.0/tests/greendns_test.py
--- old/eventlet-0.30.2/tests/greendns_test.py 2021-02-02 10:04:54.000000000
+0100
+++ new/eventlet-0.32.0/tests/greendns_test.py 2021-09-01 12:49:47.000000000
+0200
@@ -901,7 +901,7 @@
resolver.nameserver_ports[dnsaddr[0]] = dnsaddr[1]
response = resolver.query('host.example.com', 'a', tcp=True)
self.assertIsInstance(response, Answer)
- self.assertEqual(response.rrset.items[0].address, expected_ip)
+ self.assertEqual(list(response.rrset.items)[0].address,
expected_ip)
def test_reverse_name():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/tests/hub_test.py
new/eventlet-0.32.0/tests/hub_test.py
--- old/eventlet-0.30.2/tests/hub_test.py 2021-02-02 10:04:54.000000000
+0100
+++ new/eventlet-0.32.0/tests/hub_test.py 2021-09-01 12:49:47.000000000
+0200
@@ -362,7 +362,7 @@
# kill dummyproc, this schedules a timer to return execution to
# this greenlet before throwing an exception in dummyproc.
# it is from this timer that execution should be returned to this
- # greenlet, and not by propogating of the terminating greenlet.
+ # greenlet, and not by propagating of the terminating greenlet.
g.kill()
with eventlet.Timeout(0.5, self.CustomException()):
# we now switch to the hub, there should be no existing timers
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/eventlet-0.30.2/tests/isolated/socket_resolve_green.py
new/eventlet-0.32.0/tests/isolated/socket_resolve_green.py
--- old/eventlet-0.30.2/tests/isolated/socket_resolve_green.py 2021-02-02
10:04:54.000000000 +0100
+++ new/eventlet-0.32.0/tests/isolated/socket_resolve_green.py 2021-09-01
12:49:47.000000000 +0200
@@ -7,6 +7,7 @@
import time
import dns.message
import dns.query
+ import dns.flags
n = 10
delay = 0.01
@@ -17,7 +18,7 @@
addr = addr_map[qname.to_text()]
r = dns.message.make_response(q)
r.index = None
- r.flags = 256
+ r.flags = dns.flags.QR | dns.flags.RD
r.answer.append(dns.rrset.from_text(str(qname), 60, 'IN', 'A', addr))
r.time = 0.001
eventlet.sleep(delay)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/tests/mysqldb_test.py
new/eventlet-0.32.0/tests/mysqldb_test.py
--- old/eventlet-0.30.2/tests/mysqldb_test.py 2021-02-02 10:04:54.000000000
+0100
+++ new/eventlet-0.32.0/tests/mysqldb_test.py 2021-09-01 12:49:47.000000000
+0200
@@ -38,6 +38,8 @@
class TestMySQLdb(tests.LimitedTestCase):
+ TEST_TIMEOUT = 5
+
def setUp(self):
self._auth = get_database_auth()['MySQLdb']
self.create_db()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/tests/socket_test.py
new/eventlet-0.32.0/tests/socket_test.py
--- old/eventlet-0.30.2/tests/socket_test.py 2021-02-02 10:04:54.000000000
+0100
+++ new/eventlet-0.32.0/tests/socket_test.py 2021-09-01 12:49:47.000000000
+0200
@@ -99,3 +99,11 @@
tests.check_is_timeout(e)
else:
assert False, 'No timeout, socket.error was not raised'
+
+
+def test_connect_ex_success():
+ # https://github.com/eventlet/eventlet/issues/696
+ server = eventlet.listen(("127.0.0.1", 0))
+ client = socket.socket()
+ result = client.connect_ex(server.getsockname())
+ assert result == 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/tests/ssl_test.py
new/eventlet-0.32.0/tests/ssl_test.py
--- old/eventlet-0.30.2/tests/ssl_test.py 2021-02-02 10:04:54.000000000
+0100
+++ new/eventlet-0.32.0/tests/ssl_test.py 2021-09-01 12:49:47.000000000
+0200
@@ -1,6 +1,7 @@
import contextlib
import random
import socket
+import sys
import warnings
import eventlet
@@ -371,3 +372,26 @@
peer, _ = server_tls.accept()
assert peer.recv(64) == expected
peer.close()
+
+ def test_client_check_hostname(self):
+ # stdlib API compatibility
+ # https://github.com/eventlet/eventlet/issues/567
+ def serve(listener):
+ sock, addr = listener.accept()
+ sock.recv(64)
+ sock.sendall(b"response")
+ sock.close()
+
+ listener = listen_ssl_socket()
+ server_coro = eventlet.spawn(serve, listener)
+ ctx = ssl.create_default_context()
+ ctx.verify_mode = ssl.CERT_REQUIRED
+ ctx.check_hostname = True
+ ctx.load_verify_locations(tests.certificate_file)
+ ctx.load_cert_chain(tests.certificate_file, tests.private_key_file)
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ client = ctx.wrap_socket(sock, server_hostname="Test")
+ client.connect(listener.getsockname())
+ client.send(b"check_hostname works")
+ client.recv(64)
+ server_coro.wait()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/tests/websocket_new_test.py
new/eventlet-0.32.0/tests/websocket_new_test.py
--- old/eventlet-0.30.2/tests/websocket_new_test.py 2021-02-02
10:04:54.000000000 +0100
+++ new/eventlet-0.32.0/tests/websocket_new_test.py 2021-09-01
12:49:47.000000000 +0200
@@ -30,7 +30,12 @@
else:
ws.close()
-wsapp = websocket.WebSocketWSGI(handle)
+
+# Set a lower limit of DEFAULT_MAX_FRAME_LENGTH for testing, as
+# sending an 8MiB frame over the loopback interface can trigger a
+# timeout.
+TEST_MAX_FRAME_LENGTH = 50000
+wsapp = websocket.WebSocketWSGI(handle, max_frame_length=TEST_MAX_FRAME_LENGTH)
class TestWebSocket(tests.wsgi_test._TestBase):
@@ -534,3 +539,55 @@
ws.close()
eventlet.sleep(0.01)
+
+ def test_large_frame_size_compressed_13(self):
+ # Test fix for GHSA-9p9m-jm8w-94p2
+ extensions_string = 'permessage-deflate'
+ extensions = {'permessage-deflate': {
+ 'client_no_context_takeover': False,
+ 'server_no_context_takeover': False}}
+
+ sock = eventlet.connect(self.server_addr)
+ sock.sendall(six.b(self.connect % extensions_string))
+ sock.recv(1024)
+ ws = websocket.RFC6455WebSocket(sock, {}, client=True,
extensions=extensions)
+
+ should_still_fit = b"x" * TEST_MAX_FRAME_LENGTH
+ one_too_much = should_still_fit + b"x"
+
+ # send just fitting frame twice to make sure they are fine
independently
+ ws.send(should_still_fit)
+ assert ws.wait() == should_still_fit
+ ws.send(should_still_fit)
+ assert ws.wait() == should_still_fit
+ ws.send(one_too_much)
+
+ res = ws.wait()
+ assert res is None # socket closed
+ # TODO: The websocket currently sents compressed control frames, which
contradicts RFC7692.
+ # Renable the following assert after that has been fixed.
+ # assert ws._remote_close_data == b"\x03\xf1Incoming compressed frame
is above length limit."
+ eventlet.sleep(0.01)
+
+ def test_large_frame_size_uncompressed_13(self):
+ # Test fix for GHSA-9p9m-jm8w-94p2
+ sock = eventlet.connect(self.server_addr)
+ sock.sendall(six.b(self.connect))
+ sock.recv(1024)
+ ws = websocket.RFC6455WebSocket(sock, {}, client=True)
+
+ should_still_fit = b"x" * TEST_MAX_FRAME_LENGTH
+ one_too_much = should_still_fit + b"x"
+
+ # send just fitting frame twice to make sure they are fine
independently
+ ws.send(should_still_fit)
+ assert ws.wait() == should_still_fit
+ ws.send(should_still_fit)
+ assert ws.wait() == should_still_fit
+ ws.send(one_too_much)
+
+ res = ws.wait()
+ assert res is None # socket closed
+ # close code should be available now
+ assert ws._remote_close_data == b"\x03\xf1Incoming frame of 50001
bytes is above length limit of 50000 bytes."
+ eventlet.sleep(0.01)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/tests/websocket_test.py
new/eventlet-0.32.0/tests/websocket_test.py
--- old/eventlet-0.30.2/tests/websocket_test.py 2021-02-02 10:04:54.000000000
+0100
+++ new/eventlet-0.32.0/tests/websocket_test.py 2021-09-01 12:49:47.000000000
+0200
@@ -528,6 +528,38 @@
with eventlet.Timeout(1):
pool.waitall()
+ def test_wrapped_wsgi(self):
+ site = self.site
+
+ def wrapper(environ, start_response):
+ for chunk in site(environ, start_response):
+ yield chunk
+
+ self.site = wrapper
+ self.spawn_server()
+ connect = [
+ "GET /range HTTP/1.1",
+ "Upgrade: WebSocket",
+ "Connection: Upgrade",
+ "Host: {}:{}".format(*self.server_addr),
+ "Origin: http://{}:{}".format(*self.server_addr),
+ "WebSocket-Protocol: ws",
+ ]
+ sock = eventlet.connect(self.server_addr)
+
+ sock.sendall(six.b("\r\n".join(connect) + "\r\n\r\n"))
+ resp = sock.recv(1024)
+ headers, result = resp.split(b"\r\n\r\n")
+ msgs = [result.strip(b"\x00\xff")]
+ msgs.extend(sock.recv(20).strip(b"\x00\xff") for _ in range(10))
+ expect = [six.b("msg {}".format(i)) for i in range(10)] + [b""]
+ assert msgs == expect
+ # In case of server error, server will write HTTP 500 response to the
socket
+ msg = sock.recv(20)
+ assert not msg
+ sock.close()
+ eventlet.sleep(0.01)
+
class TestWebSocketSSL(tests.wsgi_test._TestBase):
def set_site(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/eventlet-0.30.2/tests/wsgi_test.py
new/eventlet-0.32.0/tests/wsgi_test.py
--- old/eventlet-0.30.2/tests/wsgi_test.py 2021-02-02 10:04:54.000000000
+0100
+++ new/eventlet-0.32.0/tests/wsgi_test.py 2021-09-01 12:49:47.000000000
+0200
@@ -103,7 +103,8 @@
def already_handled(env, start_response):
start_response('200 OK', [('Content-type', 'text/plain')])
- return wsgi.ALREADY_HANDLED
+ wsgi.WSGI_LOCAL.already_handled = True
+ return []
class Site(object):
@@ -115,8 +116,7 @@
class IterableApp(object):
-
- def __init__(self, send_start_response=False,
return_val=wsgi.ALREADY_HANDLED):
+ def __init__(self, send_start_response=False, return_val=()):
self.send_start_response = send_start_response
self.return_val = return_val
self.env = {}
@@ -125,6 +125,8 @@
self.env = env
if self.send_start_response:
start_response('200 OK', [('Content-type', 'text/plain')])
+ else:
+ wsgi.WSGI_LOCAL.already_handled = True
return self.return_val
@@ -395,7 +397,7 @@
# Eventlet issue: "Python 3: wsgi doesn't handle correctly partial
# write of socket send() when using writelines()".
#
- # The bug was caused by the default writelines() implementaiton
+ # The bug was caused by the default writelines() implementation
# (used by the wsgi module) which doesn't check if write()
# successfully completed sending *all* data therefore data could be
# lost and the client could be left hanging forever.
++++++ newdnspython.patch ++++++
--- /var/tmp/diff_new_pack.12tFtF/_old 2021-11-21 23:51:46.554331506 +0100
+++ /var/tmp/diff_new_pack.12tFtF/_new 2021-11-21 23:51:46.558331493 +0100
@@ -1,8 +1,8 @@
-Index: eventlet-0.29.1/eventlet/support/greendns.py
+Index: eventlet-0.32.0/eventlet/support/greendns.py
===================================================================
---- eventlet-0.29.1.orig/eventlet/support/greendns.py
-+++ eventlet-0.29.1/eventlet/support/greendns.py
-@@ -313,7 +313,7 @@ class ResolverProxy(object):
+--- eventlet-0.32.0.orig/eventlet/support/greendns.py
++++ eventlet-0.32.0/eventlet/support/greendns.py
+@@ -325,7 +325,7 @@ class ResolverProxy(object):
self.clear()
def clear(self):
@@ -11,10 +11,10 @@
self._resolver.cache = dns.resolver.LRUCache()
def query(self, qname, rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN,
-Index: eventlet-0.29.1/tests/greendns_test.py
+Index: eventlet-0.32.0/tests/greendns_test.py
===================================================================
---- eventlet-0.29.1.orig/tests/greendns_test.py
-+++ eventlet-0.29.1/tests/greendns_test.py
+--- eventlet-0.32.0.orig/tests/greendns_test.py
++++ eventlet-0.32.0/tests/greendns_test.py
@@ -885,7 +885,7 @@ class TinyDNSTests(tests.LimitedTestCase
# https://github.com/eventlet/eventlet/issues/499
# None means we don't want the server to find the IP
@@ -33,16 +33,3 @@
resolver.nameservers = [dnsaddr[0]]
resolver.nameserver_ports[dnsaddr[0]] = dnsaddr[1]
response = resolver.query('host.example.com', 'a', tcp=True)
-Index: eventlet-0.29.1/setup.py
-===================================================================
---- eventlet-0.29.1.orig/setup.py
-+++ eventlet-0.29.1/setup.py
-@@ -15,7 +15,7 @@ setuptools.setup(
- url='http://eventlet.net',
- packages=setuptools.find_packages(exclude=['benchmarks', 'tests',
'tests.*']),
- install_requires=(
-- 'dnspython >= 1.15.0, < 2.0.0',
-+ 'dnspython >= 1.15.0',
- 'greenlet >= 0.3',
- 'monotonic >= 1.4;python_version<"3.5"',
- 'six >= 1.10.0',
++++++ remove_nose.patch ++++++
--- /var/tmp/diff_new_pack.12tFtF/_old 2021-11-21 23:51:46.566331467 +0100
+++ /var/tmp/diff_new_pack.12tFtF/_new 2021-11-21 23:51:46.570331454 +0100
@@ -1,5 +1,7 @@
---- a/setup.py
-+++ b/setup.py
+Index: eventlet-0.32.0/setup.py
+===================================================================
+--- eventlet-0.32.0.orig/setup.py
++++ eventlet-0.32.0/setup.py
@@ -27,7 +27,7 @@ setuptools.setup(
'README.rst'
)
@@ -9,8 +11,10 @@
classifiers=[
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
---- a/eventlet.egg-info/SOURCES.txt
-+++ b/eventlet.egg-info/SOURCES.txt
+Index: eventlet-0.32.0/eventlet.egg-info/SOURCES.txt
+===================================================================
+--- eventlet-0.32.0.orig/eventlet.egg-info/SOURCES.txt
++++ eventlet-0.32.0/eventlet.egg-info/SOURCES.txt
@@ -174,7 +174,6 @@ tests/greenthread_test.py
tests/hub_test.py
tests/mock.py
@@ -19,15 +23,17 @@
tests/openssl_test.py
tests/os_test.py
tests/parse_results.py
-@@ -270,4 +269,4 @@ tests/stdlib/test_threading_local.py
+@@ -273,4 +272,4 @@ tests/stdlib/test_threading_local.py
tests/stdlib/test_timeout.py
tests/stdlib/test_urllib.py
tests/stdlib/test_urllib2.py
-tests/stdlib/test_urllib2_localnet.py
\ No newline at end of file
+tests/stdlib/test_urllib2_localnet.py
---- a/tests/greenio_test.py
-+++ b/tests/greenio_test.py
+Index: eventlet-0.32.0/tests/greenio_test.py
+===================================================================
+--- eventlet-0.32.0.orig/tests/greenio_test.py
++++ eventlet-0.32.0/tests/greenio_test.py
@@ -9,8 +9,6 @@ import socket as _orig_sock
import sys
import tempfile
@@ -57,8 +63,10 @@
def test_get_fileno_of_a_socket_works():
---- a/tests/nosewrapper.py
-+++ b/tests/nosewrapper.py
+Index: eventlet-0.32.0/tests/nosewrapper.py
+===================================================================
+--- eventlet-0.32.0.orig/tests/nosewrapper.py
++++ eventlet-0.32.0/tests/nosewrapper.py
@@ -1,20 +1,13 @@
""" This script simply gets the paths correct for testing eventlet with the
hub extension for Nose."""
@@ -83,8 +91,10 @@
-launch(argv=sys.argv)
+if __name__ == '__main__':
+ unittest.main()
---- a/tests/__init__.py
-+++ b/tests/__init__.py
+Index: eventlet-0.32.0/tests/__init__.py
+===================================================================
+--- eventlet-0.32.0.orig/tests/__init__.py
++++ eventlet-0.32.0/tests/__init__.py
@@ -20,7 +20,7 @@ import sys
import unittest
import warnings
@@ -102,8 +112,10 @@
raise SkipTest('CPU usage testing not supported (`import resource`
failed)')
r1 = resource.getrusage(resource.RUSAGE_SELF)
---- a/tests/dagpool_test.py
-+++ b/tests/dagpool_test.py
+Index: eventlet-0.32.0/tests/dagpool_test.py
+===================================================================
+--- eventlet-0.32.0.orig/tests/dagpool_test.py
++++ eventlet-0.32.0/tests/dagpool_test.py
@@ -5,7 +5,6 @@
@brief Test DAGPool class
"""