mirror of
https://github.com/SickGear/SickGear.git
synced 2024-12-18 16:53:38 +00:00
Update urllib3 1.26.14 (a06c05c) → 1.26.15 (25cca389).
This commit is contained in:
parent
b6cfffb4e3
commit
7ea6a684bf
6 changed files with 205 additions and 10 deletions
|
@ -5,6 +5,7 @@
|
||||||
* Update Requests library 2.28.1 (ec553c2) to 2.29.0 (87d63de)
|
* Update Requests library 2.28.1 (ec553c2) to 2.29.0 (87d63de)
|
||||||
* Update SimpleJSON 3.18.1 (c891b95) to 3.19.1 (aeb63ee)
|
* Update SimpleJSON 3.18.1 (c891b95) to 3.19.1 (aeb63ee)
|
||||||
* Update Tornado Web Server 6.3.0 (7186b86) to 6.3.1 (419838b)
|
* Update Tornado Web Server 6.3.0 (7186b86) to 6.3.1 (419838b)
|
||||||
|
* Update urllib3 1.26.14 (a06c05c) to 1.26.15 (25cca389)
|
||||||
|
|
||||||
|
|
||||||
### 3.28.0 (2023-04-12 13:05:00 UTC)
|
### 3.28.0 (2023-04-12 13:05:00 UTC)
|
||||||
|
|
|
@ -19,6 +19,23 @@ from .util.retry import Retry
|
||||||
from .util.timeout import Timeout
|
from .util.timeout import Timeout
|
||||||
from .util.url import get_host
|
from .util.url import get_host
|
||||||
|
|
||||||
|
# === NOTE TO REPACKAGERS AND VENDORS ===
|
||||||
|
# Please delete this block, this logic is only
|
||||||
|
# for urllib3 being distributed via PyPI.
|
||||||
|
# See: https://github.com/urllib3/urllib3/issues/2680
|
||||||
|
try:
|
||||||
|
import urllib3_secure_extra # type: ignore # noqa: F401
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
warnings.warn(
|
||||||
|
"'urllib3[secure]' extra is deprecated and will be removed "
|
||||||
|
"in a future release of urllib3 2.x. Read more in this issue: "
|
||||||
|
"https://github.com/urllib3/urllib3/issues/2680",
|
||||||
|
category=DeprecationWarning,
|
||||||
|
stacklevel=2,
|
||||||
|
)
|
||||||
|
|
||||||
__author__ = "Andrey Petrov (andrey.petrov@shazow.net)"
|
__author__ = "Andrey Petrov (andrey.petrov@shazow.net)"
|
||||||
__license__ = "MIT"
|
__license__ = "MIT"
|
||||||
__version__ = __version__
|
__version__ = __version__
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
# This file is protected via CODEOWNERS
|
# This file is protected via CODEOWNERS
|
||||||
__version__ = "1.26.14"
|
__version__ = "1.26.15"
|
||||||
|
|
|
@ -50,6 +50,13 @@ from .util.url import Url, _encode_target
|
||||||
from .util.url import _normalize_host as normalize_host
|
from .util.url import _normalize_host as normalize_host
|
||||||
from .util.url import get_host, parse_url
|
from .util.url import get_host, parse_url
|
||||||
|
|
||||||
|
try: # Platform-specific: Python 3
|
||||||
|
import weakref
|
||||||
|
|
||||||
|
weakref_finalize = weakref.finalize
|
||||||
|
except AttributeError: # Platform-specific: Python 2
|
||||||
|
from .packages.backports.weakref_finalize import weakref_finalize
|
||||||
|
|
||||||
xrange = six.moves.xrange
|
xrange = six.moves.xrange
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
@ -220,6 +227,16 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
|
||||||
self.conn_kw["proxy"] = self.proxy
|
self.conn_kw["proxy"] = self.proxy
|
||||||
self.conn_kw["proxy_config"] = self.proxy_config
|
self.conn_kw["proxy_config"] = self.proxy_config
|
||||||
|
|
||||||
|
# Do not pass 'self' as callback to 'finalize'.
|
||||||
|
# Then the 'finalize' would keep an endless living (leak) to self.
|
||||||
|
# By just passing a reference to the pool allows the garbage collector
|
||||||
|
# to free self if nobody else has a reference to it.
|
||||||
|
pool = self.pool
|
||||||
|
|
||||||
|
# Close all the HTTPConnections in the pool before the
|
||||||
|
# HTTPConnectionPool object is garbage collected.
|
||||||
|
weakref_finalize(self, _close_pool_connections, pool)
|
||||||
|
|
||||||
def _new_conn(self):
|
def _new_conn(self):
|
||||||
"""
|
"""
|
||||||
Return a fresh :class:`HTTPConnection`.
|
Return a fresh :class:`HTTPConnection`.
|
||||||
|
@ -489,14 +506,8 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
|
||||||
# Disable access to the pool
|
# Disable access to the pool
|
||||||
old_pool, self.pool = self.pool, None
|
old_pool, self.pool = self.pool, None
|
||||||
|
|
||||||
try:
|
# Close all the HTTPConnections in the pool.
|
||||||
while True:
|
_close_pool_connections(old_pool)
|
||||||
conn = old_pool.get(block=False)
|
|
||||||
if conn:
|
|
||||||
conn.close()
|
|
||||||
|
|
||||||
except queue.Empty:
|
|
||||||
pass # Done.
|
|
||||||
|
|
||||||
def is_same_host(self, url):
|
def is_same_host(self, url):
|
||||||
"""
|
"""
|
||||||
|
@ -1108,3 +1119,14 @@ def _normalize_host(host, scheme):
|
||||||
if host.startswith("[") and host.endswith("]"):
|
if host.startswith("[") and host.endswith("]"):
|
||||||
host = host[1:-1]
|
host = host[1:-1]
|
||||||
return host
|
return host
|
||||||
|
|
||||||
|
|
||||||
|
def _close_pool_connections(pool):
|
||||||
|
"""Drains a queue of connections and closes each one."""
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
conn = pool.get(block=False)
|
||||||
|
if conn:
|
||||||
|
conn.close()
|
||||||
|
except queue.Empty:
|
||||||
|
pass # Done.
|
||||||
|
|
155
lib/urllib3/packages/backports/weakref_finalize.py
Normal file
155
lib/urllib3/packages/backports/weakref_finalize.py
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
backports.weakref_finalize
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Backports the Python 3 ``weakref.finalize`` method.
|
||||||
|
"""
|
||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
|
import itertools
|
||||||
|
import sys
|
||||||
|
from weakref import ref
|
||||||
|
|
||||||
|
__all__ = ["weakref_finalize"]
|
||||||
|
|
||||||
|
|
||||||
|
class weakref_finalize(object):
|
||||||
|
"""Class for finalization of weakrefable objects
|
||||||
|
finalize(obj, func, *args, **kwargs) returns a callable finalizer
|
||||||
|
object which will be called when obj is garbage collected. The
|
||||||
|
first time the finalizer is called it evaluates func(*arg, **kwargs)
|
||||||
|
and returns the result. After this the finalizer is dead, and
|
||||||
|
calling it just returns None.
|
||||||
|
When the program exits any remaining finalizers for which the
|
||||||
|
atexit attribute is true will be run in reverse order of creation.
|
||||||
|
By default atexit is true.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Finalizer objects don't have any state of their own. They are
|
||||||
|
# just used as keys to lookup _Info objects in the registry. This
|
||||||
|
# ensures that they cannot be part of a ref-cycle.
|
||||||
|
|
||||||
|
__slots__ = ()
|
||||||
|
_registry = {}
|
||||||
|
_shutdown = False
|
||||||
|
_index_iter = itertools.count()
|
||||||
|
_dirty = False
|
||||||
|
_registered_with_atexit = False
|
||||||
|
|
||||||
|
class _Info(object):
|
||||||
|
__slots__ = ("weakref", "func", "args", "kwargs", "atexit", "index")
|
||||||
|
|
||||||
|
def __init__(self, obj, func, *args, **kwargs):
|
||||||
|
if not self._registered_with_atexit:
|
||||||
|
# We may register the exit function more than once because
|
||||||
|
# of a thread race, but that is harmless
|
||||||
|
import atexit
|
||||||
|
|
||||||
|
atexit.register(self._exitfunc)
|
||||||
|
weakref_finalize._registered_with_atexit = True
|
||||||
|
info = self._Info()
|
||||||
|
info.weakref = ref(obj, self)
|
||||||
|
info.func = func
|
||||||
|
info.args = args
|
||||||
|
info.kwargs = kwargs or None
|
||||||
|
info.atexit = True
|
||||||
|
info.index = next(self._index_iter)
|
||||||
|
self._registry[self] = info
|
||||||
|
weakref_finalize._dirty = True
|
||||||
|
|
||||||
|
def __call__(self, _=None):
|
||||||
|
"""If alive then mark as dead and return func(*args, **kwargs);
|
||||||
|
otherwise return None"""
|
||||||
|
info = self._registry.pop(self, None)
|
||||||
|
if info and not self._shutdown:
|
||||||
|
return info.func(*info.args, **(info.kwargs or {}))
|
||||||
|
|
||||||
|
def detach(self):
|
||||||
|
"""If alive then mark as dead and return (obj, func, args, kwargs);
|
||||||
|
otherwise return None"""
|
||||||
|
info = self._registry.get(self)
|
||||||
|
obj = info and info.weakref()
|
||||||
|
if obj is not None and self._registry.pop(self, None):
|
||||||
|
return (obj, info.func, info.args, info.kwargs or {})
|
||||||
|
|
||||||
|
def peek(self):
|
||||||
|
"""If alive then return (obj, func, args, kwargs);
|
||||||
|
otherwise return None"""
|
||||||
|
info = self._registry.get(self)
|
||||||
|
obj = info and info.weakref()
|
||||||
|
if obj is not None:
|
||||||
|
return (obj, info.func, info.args, info.kwargs or {})
|
||||||
|
|
||||||
|
@property
|
||||||
|
def alive(self):
|
||||||
|
"""Whether finalizer is alive"""
|
||||||
|
return self in self._registry
|
||||||
|
|
||||||
|
@property
|
||||||
|
def atexit(self):
|
||||||
|
"""Whether finalizer should be called at exit"""
|
||||||
|
info = self._registry.get(self)
|
||||||
|
return bool(info) and info.atexit
|
||||||
|
|
||||||
|
@atexit.setter
|
||||||
|
def atexit(self, value):
|
||||||
|
info = self._registry.get(self)
|
||||||
|
if info:
|
||||||
|
info.atexit = bool(value)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
info = self._registry.get(self)
|
||||||
|
obj = info and info.weakref()
|
||||||
|
if obj is None:
|
||||||
|
return "<%s object at %#x; dead>" % (type(self).__name__, id(self))
|
||||||
|
else:
|
||||||
|
return "<%s object at %#x; for %r at %#x>" % (
|
||||||
|
type(self).__name__,
|
||||||
|
id(self),
|
||||||
|
type(obj).__name__,
|
||||||
|
id(obj),
|
||||||
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _select_for_exit(cls):
|
||||||
|
# Return live finalizers marked for exit, oldest first
|
||||||
|
L = [(f, i) for (f, i) in cls._registry.items() if i.atexit]
|
||||||
|
L.sort(key=lambda item: item[1].index)
|
||||||
|
return [f for (f, i) in L]
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _exitfunc(cls):
|
||||||
|
# At shutdown invoke finalizers for which atexit is true.
|
||||||
|
# This is called once all other non-daemonic threads have been
|
||||||
|
# joined.
|
||||||
|
reenable_gc = False
|
||||||
|
try:
|
||||||
|
if cls._registry:
|
||||||
|
import gc
|
||||||
|
|
||||||
|
if gc.isenabled():
|
||||||
|
reenable_gc = True
|
||||||
|
gc.disable()
|
||||||
|
pending = None
|
||||||
|
while True:
|
||||||
|
if pending is None or weakref_finalize._dirty:
|
||||||
|
pending = cls._select_for_exit()
|
||||||
|
weakref_finalize._dirty = False
|
||||||
|
if not pending:
|
||||||
|
break
|
||||||
|
f = pending.pop()
|
||||||
|
try:
|
||||||
|
# gc is disabled, so (assuming no daemonic
|
||||||
|
# threads) the following is the only line in
|
||||||
|
# this function which might trigger creation
|
||||||
|
# of a new finalizer
|
||||||
|
f()
|
||||||
|
except Exception:
|
||||||
|
sys.excepthook(*sys.exc_info())
|
||||||
|
assert f not in cls._registry
|
||||||
|
finally:
|
||||||
|
# prevent any more finalizers from executing during shutdown
|
||||||
|
weakref_finalize._shutdown = True
|
||||||
|
if reenable_gc:
|
||||||
|
gc.enable()
|
|
@ -171,7 +171,7 @@ class PoolManager(RequestMethods):
|
||||||
def __init__(self, num_pools=10, headers=None, **connection_pool_kw):
|
def __init__(self, num_pools=10, headers=None, **connection_pool_kw):
|
||||||
RequestMethods.__init__(self, headers)
|
RequestMethods.__init__(self, headers)
|
||||||
self.connection_pool_kw = connection_pool_kw
|
self.connection_pool_kw = connection_pool_kw
|
||||||
self.pools = RecentlyUsedContainer(num_pools, dispose_func=lambda p: p.close())
|
self.pools = RecentlyUsedContainer(num_pools)
|
||||||
|
|
||||||
# Locally set the pool classes and keys so other PoolManagers can
|
# Locally set the pool classes and keys so other PoolManagers can
|
||||||
# override them.
|
# override them.
|
||||||
|
|
Loading…
Reference in a new issue