diff --git a/eventlet/green/http/client.py b/eventlet/green/http/client.py
index e4bd2ad..125c0bf 100644
--- a/eventlet/green/http/client.py
+++ b/eventlet/green/http/client.py
@@ -1447,6 +1447,18 @@ try:
except ImportError:
pass
else:
+ def _create_https_context(http_version):
+ # Function also used by urllib.request to be able to set the check_hostname
+ # attribute on a context object.
+ context = ssl._create_default_https_context()
+ # send ALPN extension to indicate HTTP/1.1 protocol
+ if http_version == 11:
+ context.set_alpn_protocols(['http/1.1'])
+ # enable PHA for TLS 1.3 connections if available
+ if context.post_handshake_auth is not None:
+ context.post_handshake_auth = True
+ return context
+
class HTTPSConnection(HTTPConnection):
"This class allows communication via SSL."
@@ -1463,13 +1475,9 @@ else:
self.key_file = key_file
self.cert_file = cert_file
if context is None:
- context = ssl._create_default_https_context()
- will_verify = context.verify_mode != ssl.CERT_NONE
- if check_hostname is None:
- check_hostname = context.check_hostname
- if check_hostname and not will_verify:
- raise ValueError("check_hostname needs a SSL context with "
- "either CERT_OPTIONAL or CERT_REQUIRED")
+ context = _create_https_context(self._http_vsn)
+ if check_hostname is not None:
+ context.check_hostname = check_hostname
if key_file or cert_file:
context.load_cert_chain(cert_file, key_file)
self._context = context
diff --git a/eventlet/green/ssl.py b/eventlet/green/ssl.py
index b42ddaa..74b6c46 100644
--- a/eventlet/green/ssl.py
+++ b/eventlet/green/ssl.py
@@ -22,21 +22,17 @@ __patched__ = [
'create_default_context', '_create_default_https_context']
_original_sslsocket = __ssl.SSLSocket
-_original_wrap_socket = __ssl.wrap_socket
_original_sslcontext = getattr(__ssl, 'SSLContext', None)
_is_under_py_3_7 = sys.version_info < (3, 7)
@contextmanager
def _original_ssl_context(*args, **kwargs):
- tmp_sslcontext = _original_wrap_socket.__globals__.get('SSLContext', None)
tmp_sslsocket = _original_sslsocket._create.__globals__.get('SSLSocket', None)
_original_sslsocket._create.__globals__['SSLSocket'] = _original_sslsocket
- _original_wrap_socket.__globals__['SSLContext'] = _original_sslcontext
try:
yield
finally:
- _original_wrap_socket.__globals__['SSLContext'] = tmp_sslcontext
_original_sslsocket._create.__globals__['SSLSocket'] = tmp_sslsocket
@@ -76,16 +72,21 @@ class GreenSSLSocket(_original_sslsocket):
session=kw.get('session'),
)
else:
- ret = _original_wrap_socket(
+ context = _original_sslcontext(protocol=ssl_version)
+ context.options |= cert_reqs
+ if certfile or keyfile:
+ context.load_cert_chain(
+ certfile=certfile,
+ keyfile=keyfile,
+ )
+ if ca_certs:
+ context.load_verify_locations(ca_certs)
+ if ciphers := kw.get('ciphers'):
+ context.set_ciphers(ciphers)
+ ret = context.wrap_socket(
sock=sock.fd,
- keyfile=keyfile,
- certfile=certfile,
server_side=server_side,
- cert_reqs=cert_reqs,
- ssl_version=ssl_version,
- ca_certs=ca_certs,
do_handshake_on_connect=False,
- ciphers=kw.get('ciphers'),
)
ret.keyfile = keyfile
ret.certfile = certfile
diff --git a/eventlet/green/thread.py b/eventlet/green/thread.py
index e26f6b3..7bcb563 100644
--- a/eventlet/green/thread.py
+++ b/eventlet/green/thread.py
@@ -113,3 +113,6 @@ if hasattr(__thread, 'stack_size'):
# this thread will suffer
from eventlet.corolocal import local as _local
+
+if hasattr(__thread, 'daemon_threads_allowed'):
+ daemon_threads_allowed = __thread.daemon_threads_allowed
diff --git a/tests/dagpool_test.py b/tests/dagpool_test.py
index fdc23e7..dcd7dd8 100644
--- a/tests/dagpool_test.py
+++ b/tests/dagpool_test.py
@@ -191,14 +191,14 @@ def test_init():
with check_no_suspend():
results = pool.waitall()
# with no spawn() or post(), waitall() returns preload data
- assert_equals(results, dict(a=1, b=2, c=3))
+ assert_equal(results, dict(a=1, b=2, c=3))
# preload sequence of pairs
pool = DAGPool([("d", 4), ("e", 5), ("f", 6)])
# this must not hang
with check_no_suspend():
results = pool.waitall()
- assert_equals(results, dict(d=4, e=5, f=6))
+ assert_equal(results, dict(d=4, e=5, f=6))
def test_wait_each_empty():
@@ -216,10 +216,10 @@ def test_wait_each_preload():
with check_no_suspend():
# wait_each() may deliver in arbitrary order; collect into a dict
# for comparison
- assert_equals(dict(pool.wait_each("abc")), dict(a=1, b=2, c=3))
+ assert_equal(dict(pool.wait_each("abc")), dict(a=1, b=2, c=3))
# while we're at it, test wait() for preloaded keys
- assert_equals(pool.wait("bc"), dict(b=2, c=3))
+ assert_equal(pool.wait("bc"), dict(b=2, c=3))
def post_each(pool, capture):
@@ -257,7 +257,7 @@ def test_wait_posted():
eventlet.spawn(post_each, pool, capture)
gotten = pool.wait("bcdefg")
capture.add("got all")
- assert_equals(gotten,
+ assert_equal(gotten,
dict(b=2, c=3,
d="dval", e="eval",
f="fval", g="gval"))
@@ -285,7 +285,7 @@ def test_spawn_collision_spawn():
pool = DAGPool()
pool.spawn("a", (), lambda key, results: "aval")
# hasn't yet even started
- assert_equals(pool.get("a"), None)
+ assert_equal(pool.get("a"), None)
with assert_raises(Collision):
# Attempting to spawn again with same key should collide even if the
# first spawned greenthread hasn't yet had a chance to run.
@@ -293,7 +293,7 @@ def test_spawn_collision_spawn():
# now let the spawned eventlet run
eventlet.sleep(0)
# should have finished
- assert_equals(pool.get("a"), "aval")
+ assert_equal(pool.get("a"), "aval")
with assert_raises(Collision):
# Attempting to spawn with same key collides even when the greenthread
# has completed.
@@ -324,60 +324,60 @@ def test_spawn_multiple():
capture.step()
# but none of them has yet produced a result
for k in "defgh":
- assert_equals(pool.get(k), None)
- assert_equals(set(pool.keys()), set("abc"))
- assert_equals(dict(pool.items()), dict(a=1, b=2, c=3))
- assert_equals(pool.running(), 5)
- assert_equals(set(pool.running_keys()), set("defgh"))
- assert_equals(pool.waiting(), 1)
- assert_equals(pool.waiting_for(), dict(h=set("defg")))
- assert_equals(pool.waiting_for("d"), set())
- assert_equals(pool.waiting_for("c"), set())
+ assert_equal(pool.get(k), None)
+ assert_equal(set(pool.keys()), set("abc"))
+ assert_equal(dict(pool.items()), dict(a=1, b=2, c=3))
+ assert_equal(pool.running(), 5)
+ assert_equal(set(pool.running_keys()), set("defgh"))
+ assert_equal(pool.waiting(), 1)
+ assert_equal(pool.waiting_for(), dict(h=set("defg")))
+ assert_equal(pool.waiting_for("d"), set())
+ assert_equal(pool.waiting_for("c"), set())
with assert_raises(KeyError):
pool.waiting_for("j")
- assert_equals(pool.waiting_for("h"), set("defg"))
+ assert_equal(pool.waiting_for("h"), set("defg"))
# let one of the upstream greenthreads complete
events["f"].send("fval")
spin()
capture.step()
- assert_equals(pool.get("f"), "fval")
- assert_equals(set(pool.keys()), set("abcf"))
- assert_equals(dict(pool.items()), dict(a=1, b=2, c=3, f="fval"))
- assert_equals(pool.running(), 4)
- assert_equals(set(pool.running_keys()), set("degh"))
- assert_equals(pool.waiting(), 1)
- assert_equals(pool.waiting_for("h"), set("deg"))
+ assert_equal(pool.get("f"), "fval")
+ assert_equal(set(pool.keys()), set("abcf"))
+ assert_equal(dict(pool.items()), dict(a=1, b=2, c=3, f="fval"))
+ assert_equal(pool.running(), 4)
+ assert_equal(set(pool.running_keys()), set("degh"))
+ assert_equal(pool.waiting(), 1)
+ assert_equal(pool.waiting_for("h"), set("deg"))
# now two others
events["e"].send("eval")
events["g"].send("gval")
spin()
capture.step()
- assert_equals(pool.get("e"), "eval")
- assert_equals(pool.get("g"), "gval")
- assert_equals(set(pool.keys()), set("abcefg"))
- assert_equals(dict(pool.items()),
+ assert_equal(pool.get("e"), "eval")
+ assert_equal(pool.get("g"), "gval")
+ assert_equal(set(pool.keys()), set("abcefg"))
+ assert_equal(dict(pool.items()),
dict(a=1, b=2, c=3, e="eval", f="fval", g="gval"))
- assert_equals(pool.running(), 2)
- assert_equals(set(pool.running_keys()), set("dh"))
- assert_equals(pool.waiting(), 1)
- assert_equals(pool.waiting_for("h"), set("d"))
+ assert_equal(pool.running(), 2)
+ assert_equal(set(pool.running_keys()), set("dh"))
+ assert_equal(pool.waiting(), 1)
+ assert_equal(pool.waiting_for("h"), set("d"))
# last one
events["d"].send("dval")
# make sure both pool greenthreads get a chance to run
spin()
capture.step()
- assert_equals(pool.get("d"), "dval")
- assert_equals(set(pool.keys()), set("abcdefgh"))
- assert_equals(dict(pool.items()),
+ assert_equal(pool.get("d"), "dval")
+ assert_equal(set(pool.keys()), set("abcdefgh"))
+ assert_equal(dict(pool.items()),
dict(a=1, b=2, c=3,
d="dval", e="eval", f="fval", g="gval", h="hval"))
- assert_equals(pool.running(), 0)
+ assert_equal(pool.running(), 0)
assert_false(pool.running_keys())
- assert_equals(pool.waiting(), 0)
- assert_equals(pool.waiting_for("h"), set())
+ assert_equal(pool.waiting(), 0)
+ assert_equal(pool.waiting_for("h"), set())
capture.validate([
["h got b", "h got c"],
@@ -432,13 +432,13 @@ def test_spawn_many():
spin()
# verify that e completed (also that post(key) within greenthread
# overrides implicit post of return value, which would be None)
- assert_equals(pool.get("e"), "e")
+ assert_equal(pool.get("e"), "e")
# With the dependency graph shown above, it is not guaranteed whether b or
# c will complete first. Handle either case.
sequence = capture.sequence[:]
sequence[1:3] = [set([sequence[1].pop(), sequence[2].pop()])]
- assert_equals(sequence,
+ assert_equal(sequence,
[set(["a done"]),
set(["b done", "c done"]),
set(["d done"]),
@@ -466,7 +466,7 @@ def test_wait_each_all():
for pos in range(len(keys)):
# next value from wait_each()
k, v = next(each)
- assert_equals(k, keys[pos])
+ assert_equal(k, keys[pos])
# advance every pool greenlet as far as it can go
spin()
# everything from keys[:pos+1] should have a value by now
@@ -494,7 +494,7 @@ def test_kill():
pool.kill("a")
# didn't run
spin()
- assert_equals(pool.get("a"), None)
+ assert_equal(pool.get("a"), None)
# killing it forgets about it
with assert_raises(KeyError):
pool.kill("a")
@@ -505,7 +505,7 @@ def test_kill():
with assert_raises(KeyError):
pool.kill("a")
# verify it ran to completion
- assert_equals(pool.get("a"), 2)
+ assert_equal(pool.get("a"), 2)
def test_post_collision_preload():
@@ -533,7 +533,7 @@ def test_post_collision_spawn():
pool.kill("a")
# now we can post
pool.post("a", 3)
- assert_equals(pool.get("a"), 3)
+ assert_equal(pool.get("a"), 3)
pool = DAGPool()
pool.spawn("a", (), lambda key, result: 4)
@@ -553,10 +553,10 @@ def test_post_replace():
pool = DAGPool()
pool.post("a", 1)
pool.post("a", 2, replace=True)
- assert_equals(pool.get("a"), 2)
- assert_equals(dict(pool.wait_each("a")), dict(a=2))
- assert_equals(pool.wait("a"), dict(a=2))
- assert_equals(pool["a"], 2)
+ assert_equal(pool.get("a"), 2)
+ assert_equal(dict(pool.wait_each("a")), dict(a=2))
+ assert_equal(pool.wait("a"), dict(a=2))
+ assert_equal(pool["a"], 2)
def waitfor(capture, pool, key):
@@ -598,10 +598,10 @@ def test_waitall_exc():
try:
pool.waitall()
except PropagateError as err:
- assert_equals(err.key, "a")
+ assert_equal(err.key, "a")
assert isinstance(err.exc, BogusError), \
"exc attribute is {0}, not BogusError".format(err.exc)
- assert_equals(str(err.exc), "bogus")
+ assert_equal(str(err.exc), "bogus")
msg = str(err)
assert_in("PropagateError(a)", msg)
assert_in("BogusError", msg)
@@ -616,14 +616,14 @@ def test_propagate_exc():
try:
pool["c"]
except PropagateError as errc:
- assert_equals(errc.key, "c")
+ assert_equal(errc.key, "c")
errb = errc.exc
- assert_equals(errb.key, "b")
+ assert_equal(errb.key, "b")
erra = errb.exc
- assert_equals(erra.key, "a")
+ assert_equal(erra.key, "a")
assert isinstance(erra.exc, BogusError), \
"exc attribute is {0}, not BogusError".format(erra.exc)
- assert_equals(str(erra.exc), "bogus")
+ assert_equal(str(erra.exc), "bogus")
msg = str(errc)
assert_in("PropagateError(a)", msg)
assert_in("PropagateError(b)", msg)
@@ -681,13 +681,13 @@ def test_post_get_exc():
pass
# wait_each_success() filters
- assert_equals(dict(pool.wait_each_success()), dict(a=bogua))
- assert_equals(dict(pool.wait_each_success("ab")), dict(a=bogua))
- assert_equals(dict(pool.wait_each_success("a")), dict(a=bogua))
- assert_equals(dict(pool.wait_each_success("b")), {})
+ assert_equal(dict(pool.wait_each_success()), dict(a=bogua))
+ assert_equal(dict(pool.wait_each_success("ab")), dict(a=bogua))
+ assert_equal(dict(pool.wait_each_success("a")), dict(a=bogua))
+ assert_equal(dict(pool.wait_each_success("b")), {})
# wait_each_exception() filters the other way
- assert_equals(dict(pool.wait_each_exception()), dict(b=bogub))
- assert_equals(dict(pool.wait_each_exception("ab")), dict(b=bogub))
- assert_equals(dict(pool.wait_each_exception("a")), {})
- assert_equals(dict(pool.wait_each_exception("b")), dict(b=bogub))
+ assert_equal(dict(pool.wait_each_exception()), dict(b=bogub))
+ assert_equal(dict(pool.wait_each_exception("ab")), dict(b=bogub))
+ assert_equal(dict(pool.wait_each_exception("a")), {})
+ assert_equal(dict(pool.wait_each_exception("b")), dict(b=bogub))
diff --git a/tests/tpool_test.py b/tests/tpool_test.py
index 1a730dc..ffd947b 100644
--- a/tests/tpool_test.py
+++ b/tests/tpool_test.py
@@ -315,11 +315,11 @@ class TpoolLongTests(tests.LimitedTestCase):
@tests.skip_with_pyevent
def test_a_buncha_stuff(self):
- assert_ = self.assert_
+ assertTrue = self.assertTrue
class Dummy(object):
def foo(self, when, token=None):
- assert_(token is not None)
+ assertTrue(token is not None)
time.sleep(random.random() / 200.0)
return token
@@ -359,7 +359,7 @@ class TpoolLongTests(tests.LimitedTestCase):
first_created = middle_objs - initial_objs
gc.collect()
second_created = len(gc.get_objects()) - middle_objs
- self.assert_(second_created - first_created < 10,
+ self.assertTrue(second_created - first_created < 10,
"first loop: %s, second loop: %s" % (first_created,
second_created))
tpool.killall()