Загрузить файлы в «venv/Lib/site-packages/pip/_vendor/urllib3/util»
This commit is contained in:
49
venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py
Normal file
49
venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
|
# For backwards compatibility, provide imports that used to be here.
|
||||||
|
from .connection import is_connection_dropped
|
||||||
|
from .request import SKIP_HEADER, SKIPPABLE_HEADERS, make_headers
|
||||||
|
from .response import is_fp_closed
|
||||||
|
from .retry import Retry
|
||||||
|
from .ssl_ import (
|
||||||
|
ALPN_PROTOCOLS,
|
||||||
|
HAS_SNI,
|
||||||
|
IS_PYOPENSSL,
|
||||||
|
IS_SECURETRANSPORT,
|
||||||
|
PROTOCOL_TLS,
|
||||||
|
SSLContext,
|
||||||
|
assert_fingerprint,
|
||||||
|
resolve_cert_reqs,
|
||||||
|
resolve_ssl_version,
|
||||||
|
ssl_wrap_socket,
|
||||||
|
)
|
||||||
|
from .timeout import Timeout, current_time
|
||||||
|
from .url import Url, get_host, parse_url, split_first
|
||||||
|
from .wait import wait_for_read, wait_for_write
|
||||||
|
|
||||||
|
__all__ = (
|
||||||
|
"HAS_SNI",
|
||||||
|
"IS_PYOPENSSL",
|
||||||
|
"IS_SECURETRANSPORT",
|
||||||
|
"SSLContext",
|
||||||
|
"PROTOCOL_TLS",
|
||||||
|
"ALPN_PROTOCOLS",
|
||||||
|
"Retry",
|
||||||
|
"Timeout",
|
||||||
|
"Url",
|
||||||
|
"assert_fingerprint",
|
||||||
|
"current_time",
|
||||||
|
"is_connection_dropped",
|
||||||
|
"is_fp_closed",
|
||||||
|
"get_host",
|
||||||
|
"parse_url",
|
||||||
|
"make_headers",
|
||||||
|
"resolve_cert_reqs",
|
||||||
|
"resolve_ssl_version",
|
||||||
|
"split_first",
|
||||||
|
"ssl_wrap_socket",
|
||||||
|
"wait_for_read",
|
||||||
|
"wait_for_write",
|
||||||
|
"SKIP_HEADER",
|
||||||
|
"SKIPPABLE_HEADERS",
|
||||||
|
)
|
||||||
149
venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py
Normal file
149
venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
|
import socket
|
||||||
|
|
||||||
|
from ..contrib import _appengine_environ
|
||||||
|
from ..exceptions import LocationParseError
|
||||||
|
from ..packages import six
|
||||||
|
from .wait import NoWayToWaitForSocketError, wait_for_read
|
||||||
|
|
||||||
|
|
||||||
|
def is_connection_dropped(conn): # Platform-specific
|
||||||
|
"""
|
||||||
|
Returns True if the connection is dropped and should be closed.
|
||||||
|
|
||||||
|
:param conn:
|
||||||
|
:class:`http.client.HTTPConnection` object.
|
||||||
|
|
||||||
|
Note: For platforms like AppEngine, this will always return ``False`` to
|
||||||
|
let the platform handle connection recycling transparently for us.
|
||||||
|
"""
|
||||||
|
sock = getattr(conn, "sock", False)
|
||||||
|
if sock is False: # Platform-specific: AppEngine
|
||||||
|
return False
|
||||||
|
if sock is None: # Connection already closed (such as by httplib).
|
||||||
|
return True
|
||||||
|
try:
|
||||||
|
# Returns True if readable, which here means it's been dropped
|
||||||
|
return wait_for_read(sock, timeout=0.0)
|
||||||
|
except NoWayToWaitForSocketError: # Platform-specific: AppEngine
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
# This function is copied from socket.py in the Python 2.7 standard
|
||||||
|
# library test suite. Added to its signature is only `socket_options`.
|
||||||
|
# One additional modification is that we avoid binding to IPv6 servers
|
||||||
|
# discovered in DNS if the system doesn't have IPv6 functionality.
|
||||||
|
def create_connection(
|
||||||
|
address,
|
||||||
|
timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
|
||||||
|
source_address=None,
|
||||||
|
socket_options=None,
|
||||||
|
):
|
||||||
|
"""Connect to *address* and return the socket object.
|
||||||
|
|
||||||
|
Convenience function. Connect to *address* (a 2-tuple ``(host,
|
||||||
|
port)``) and return the socket object. Passing the optional
|
||||||
|
*timeout* parameter will set the timeout on the socket instance
|
||||||
|
before attempting to connect. If no *timeout* is supplied, the
|
||||||
|
global default timeout setting returned by :func:`socket.getdefaulttimeout`
|
||||||
|
is used. If *source_address* is set it must be a tuple of (host, port)
|
||||||
|
for the socket to bind as a source address before making the connection.
|
||||||
|
An host of '' or port 0 tells the OS to use the default.
|
||||||
|
"""
|
||||||
|
|
||||||
|
host, port = address
|
||||||
|
if host.startswith("["):
|
||||||
|
host = host.strip("[]")
|
||||||
|
err = None
|
||||||
|
|
||||||
|
# Using the value from allowed_gai_family() in the context of getaddrinfo lets
|
||||||
|
# us select whether to work with IPv4 DNS records, IPv6 records, or both.
|
||||||
|
# The original create_connection function always returns all records.
|
||||||
|
family = allowed_gai_family()
|
||||||
|
|
||||||
|
try:
|
||||||
|
host.encode("idna")
|
||||||
|
except UnicodeError:
|
||||||
|
return six.raise_from(
|
||||||
|
LocationParseError(u"'%s', label empty or too long" % host), None
|
||||||
|
)
|
||||||
|
|
||||||
|
for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
|
||||||
|
af, socktype, proto, canonname, sa = res
|
||||||
|
sock = None
|
||||||
|
try:
|
||||||
|
sock = socket.socket(af, socktype, proto)
|
||||||
|
|
||||||
|
# If provided, set socket level options before connecting.
|
||||||
|
_set_socket_options(sock, socket_options)
|
||||||
|
|
||||||
|
if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT:
|
||||||
|
sock.settimeout(timeout)
|
||||||
|
if source_address:
|
||||||
|
sock.bind(source_address)
|
||||||
|
sock.connect(sa)
|
||||||
|
return sock
|
||||||
|
|
||||||
|
except socket.error as e:
|
||||||
|
err = e
|
||||||
|
if sock is not None:
|
||||||
|
sock.close()
|
||||||
|
sock = None
|
||||||
|
|
||||||
|
if err is not None:
|
||||||
|
raise err
|
||||||
|
|
||||||
|
raise socket.error("getaddrinfo returns an empty list")
|
||||||
|
|
||||||
|
|
||||||
|
def _set_socket_options(sock, options):
|
||||||
|
if options is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
for opt in options:
|
||||||
|
sock.setsockopt(*opt)
|
||||||
|
|
||||||
|
|
||||||
|
def allowed_gai_family():
|
||||||
|
"""This function is designed to work in the context of
|
||||||
|
getaddrinfo, where family=socket.AF_UNSPEC is the default and
|
||||||
|
will perform a DNS search for both IPv6 and IPv4 records."""
|
||||||
|
|
||||||
|
family = socket.AF_INET
|
||||||
|
if HAS_IPV6:
|
||||||
|
family = socket.AF_UNSPEC
|
||||||
|
return family
|
||||||
|
|
||||||
|
|
||||||
|
def _has_ipv6(host):
|
||||||
|
"""Returns True if the system can bind an IPv6 address."""
|
||||||
|
sock = None
|
||||||
|
has_ipv6 = False
|
||||||
|
|
||||||
|
# App Engine doesn't support IPV6 sockets and actually has a quota on the
|
||||||
|
# number of sockets that can be used, so just early out here instead of
|
||||||
|
# creating a socket needlessly.
|
||||||
|
# See https://github.com/urllib3/urllib3/issues/1446
|
||||||
|
if _appengine_environ.is_appengine_sandbox():
|
||||||
|
return False
|
||||||
|
|
||||||
|
if socket.has_ipv6:
|
||||||
|
# has_ipv6 returns true if cPython was compiled with IPv6 support.
|
||||||
|
# It does not tell us if the system has IPv6 support enabled. To
|
||||||
|
# determine that we must bind to an IPv6 address.
|
||||||
|
# https://github.com/urllib3/urllib3/pull/611
|
||||||
|
# https://bugs.python.org/issue658327
|
||||||
|
try:
|
||||||
|
sock = socket.socket(socket.AF_INET6)
|
||||||
|
sock.bind((host, 0))
|
||||||
|
has_ipv6 = True
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if sock:
|
||||||
|
sock.close()
|
||||||
|
return has_ipv6
|
||||||
|
|
||||||
|
|
||||||
|
HAS_IPV6 = _has_ipv6("::1")
|
||||||
57
venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py
Normal file
57
venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
from .ssl_ import create_urllib3_context, resolve_cert_reqs, resolve_ssl_version
|
||||||
|
|
||||||
|
|
||||||
|
def connection_requires_http_tunnel(
|
||||||
|
proxy_url=None, proxy_config=None, destination_scheme=None
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Returns True if the connection requires an HTTP CONNECT through the proxy.
|
||||||
|
|
||||||
|
:param URL proxy_url:
|
||||||
|
URL of the proxy.
|
||||||
|
:param ProxyConfig proxy_config:
|
||||||
|
Proxy configuration from poolmanager.py
|
||||||
|
:param str destination_scheme:
|
||||||
|
The scheme of the destination. (i.e https, http, etc)
|
||||||
|
"""
|
||||||
|
# If we're not using a proxy, no way to use a tunnel.
|
||||||
|
if proxy_url is None:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# HTTP destinations never require tunneling, we always forward.
|
||||||
|
if destination_scheme == "http":
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Support for forwarding with HTTPS proxies and HTTPS destinations.
|
||||||
|
if (
|
||||||
|
proxy_url.scheme == "https"
|
||||||
|
and proxy_config
|
||||||
|
and proxy_config.use_forwarding_for_https
|
||||||
|
):
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Otherwise always use a tunnel.
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def create_proxy_ssl_context(
|
||||||
|
ssl_version, cert_reqs, ca_certs=None, ca_cert_dir=None, ca_cert_data=None
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Generates a default proxy ssl context if one hasn't been provided by the
|
||||||
|
user.
|
||||||
|
"""
|
||||||
|
ssl_context = create_urllib3_context(
|
||||||
|
ssl_version=resolve_ssl_version(ssl_version),
|
||||||
|
cert_reqs=resolve_cert_reqs(cert_reqs),
|
||||||
|
)
|
||||||
|
|
||||||
|
if (
|
||||||
|
not ca_certs
|
||||||
|
and not ca_cert_dir
|
||||||
|
and not ca_cert_data
|
||||||
|
and hasattr(ssl_context, "load_default_certs")
|
||||||
|
):
|
||||||
|
ssl_context.load_default_certs()
|
||||||
|
|
||||||
|
return ssl_context
|
||||||
22
venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py
Normal file
22
venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import collections
|
||||||
|
|
||||||
|
from ..packages import six
|
||||||
|
from ..packages.six.moves import queue
|
||||||
|
|
||||||
|
if six.PY2:
|
||||||
|
# Queue is imported for side effects on MS Windows. See issue #229.
|
||||||
|
import Queue as _unused_module_Queue # noqa: F401
|
||||||
|
|
||||||
|
|
||||||
|
class LifoQueue(queue.Queue):
|
||||||
|
def _init(self, _):
|
||||||
|
self.queue = collections.deque()
|
||||||
|
|
||||||
|
def _qsize(self, len=len):
|
||||||
|
return len(self.queue)
|
||||||
|
|
||||||
|
def _put(self, item):
|
||||||
|
self.queue.append(item)
|
||||||
|
|
||||||
|
def _get(self):
|
||||||
|
return self.queue.pop()
|
||||||
137
venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py
Normal file
137
venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
|
from base64 import b64encode
|
||||||
|
|
||||||
|
from ..exceptions import UnrewindableBodyError
|
||||||
|
from ..packages.six import b, integer_types
|
||||||
|
|
||||||
|
# Pass as a value within ``headers`` to skip
|
||||||
|
# emitting some HTTP headers that are added automatically.
|
||||||
|
# The only headers that are supported are ``Accept-Encoding``,
|
||||||
|
# ``Host``, and ``User-Agent``.
|
||||||
|
SKIP_HEADER = "@@@SKIP_HEADER@@@"
|
||||||
|
SKIPPABLE_HEADERS = frozenset(["accept-encoding", "host", "user-agent"])
|
||||||
|
|
||||||
|
ACCEPT_ENCODING = "gzip,deflate"
|
||||||
|
|
||||||
|
_FAILEDTELL = object()
|
||||||
|
|
||||||
|
|
||||||
|
def make_headers(
|
||||||
|
keep_alive=None,
|
||||||
|
accept_encoding=None,
|
||||||
|
user_agent=None,
|
||||||
|
basic_auth=None,
|
||||||
|
proxy_basic_auth=None,
|
||||||
|
disable_cache=None,
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Shortcuts for generating request headers.
|
||||||
|
|
||||||
|
:param keep_alive:
|
||||||
|
If ``True``, adds 'connection: keep-alive' header.
|
||||||
|
|
||||||
|
:param accept_encoding:
|
||||||
|
Can be a boolean, list, or string.
|
||||||
|
``True`` translates to 'gzip,deflate'.
|
||||||
|
List will get joined by comma.
|
||||||
|
String will be used as provided.
|
||||||
|
|
||||||
|
:param user_agent:
|
||||||
|
String representing the user-agent you want, such as
|
||||||
|
"python-urllib3/0.6"
|
||||||
|
|
||||||
|
:param basic_auth:
|
||||||
|
Colon-separated username:password string for 'authorization: basic ...'
|
||||||
|
auth header.
|
||||||
|
|
||||||
|
:param proxy_basic_auth:
|
||||||
|
Colon-separated username:password string for 'proxy-authorization: basic ...'
|
||||||
|
auth header.
|
||||||
|
|
||||||
|
:param disable_cache:
|
||||||
|
If ``True``, adds 'cache-control: no-cache' header.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
>>> make_headers(keep_alive=True, user_agent="Batman/1.0")
|
||||||
|
{'connection': 'keep-alive', 'user-agent': 'Batman/1.0'}
|
||||||
|
>>> make_headers(accept_encoding=True)
|
||||||
|
{'accept-encoding': 'gzip,deflate'}
|
||||||
|
"""
|
||||||
|
headers = {}
|
||||||
|
if accept_encoding:
|
||||||
|
if isinstance(accept_encoding, str):
|
||||||
|
pass
|
||||||
|
elif isinstance(accept_encoding, list):
|
||||||
|
accept_encoding = ",".join(accept_encoding)
|
||||||
|
else:
|
||||||
|
accept_encoding = ACCEPT_ENCODING
|
||||||
|
headers["accept-encoding"] = accept_encoding
|
||||||
|
|
||||||
|
if user_agent:
|
||||||
|
headers["user-agent"] = user_agent
|
||||||
|
|
||||||
|
if keep_alive:
|
||||||
|
headers["connection"] = "keep-alive"
|
||||||
|
|
||||||
|
if basic_auth:
|
||||||
|
headers["authorization"] = "Basic " + b64encode(b(basic_auth)).decode("utf-8")
|
||||||
|
|
||||||
|
if proxy_basic_auth:
|
||||||
|
headers["proxy-authorization"] = "Basic " + b64encode(
|
||||||
|
b(proxy_basic_auth)
|
||||||
|
).decode("utf-8")
|
||||||
|
|
||||||
|
if disable_cache:
|
||||||
|
headers["cache-control"] = "no-cache"
|
||||||
|
|
||||||
|
return headers
|
||||||
|
|
||||||
|
|
||||||
|
def set_file_position(body, pos):
|
||||||
|
"""
|
||||||
|
If a position is provided, move file to that point.
|
||||||
|
Otherwise, we'll attempt to record a position for future use.
|
||||||
|
"""
|
||||||
|
if pos is not None:
|
||||||
|
rewind_body(body, pos)
|
||||||
|
elif getattr(body, "tell", None) is not None:
|
||||||
|
try:
|
||||||
|
pos = body.tell()
|
||||||
|
except (IOError, OSError):
|
||||||
|
# This differentiates from None, allowing us to catch
|
||||||
|
# a failed `tell()` later when trying to rewind the body.
|
||||||
|
pos = _FAILEDTELL
|
||||||
|
|
||||||
|
return pos
|
||||||
|
|
||||||
|
|
||||||
|
def rewind_body(body, body_pos):
|
||||||
|
"""
|
||||||
|
Attempt to rewind body to a certain position.
|
||||||
|
Primarily used for request redirects and retries.
|
||||||
|
|
||||||
|
:param body:
|
||||||
|
File-like object that supports seek.
|
||||||
|
|
||||||
|
:param int pos:
|
||||||
|
Position to seek to in file.
|
||||||
|
"""
|
||||||
|
body_seek = getattr(body, "seek", None)
|
||||||
|
if body_seek is not None and isinstance(body_pos, integer_types):
|
||||||
|
try:
|
||||||
|
body_seek(body_pos)
|
||||||
|
except (IOError, OSError):
|
||||||
|
raise UnrewindableBodyError(
|
||||||
|
"An error occurred when rewinding request body for redirect/retry."
|
||||||
|
)
|
||||||
|
elif body_pos is _FAILEDTELL:
|
||||||
|
raise UnrewindableBodyError(
|
||||||
|
"Unable to record file position for rewinding "
|
||||||
|
"request body during a redirect/retry."
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
raise ValueError(
|
||||||
|
"body_pos must be of type integer, instead it was %s." % type(body_pos)
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user