3 E\[B@sddlmZddlZddlZddlZddlmZddlmZm Z ddlm Z ddl m Z m Z mZddlmZdd lmZdd lmZdd lmZdd lmZd ddgZejeZd6Zd7Zejd/eZ d0d1Z!ej"e!e ej"e!e d2Z#ee d2Z$Gd3d d eZ%Gd4dde%Z&d5dZ'dS)8)absolute_importN)RecentlyUsedContainer)HTTPConnectionPoolHTTPSConnectionPool)port_by_scheme)LocationValueError MaxRetryErrorProxySchemeUnknown)six)urljoin)RequestMethods) parse_url)Retry PoolManager ProxyManagerproxy_from_urlkey_file cert_file cert_reqsca_certs ssl_version ca_cert_dir ssl_context key_schemekey_hostkey_port key_timeout key_retries key_strict key_blockkey_source_address key_key_file key_cert_file key_cert_reqs key_ca_certskey_ssl_versionkey_ca_cert_dirkey_ssl_context key_maxsize key_headers key__proxykey__proxy_headerskey_socket_optionskey__socks_optionskey_assert_hostnamekey_assert_fingerprintkey_server_hostnamePoolKeycCs|j}|dj|d<|dj|d<x4d D],}||kr.||dk r.t||j||<q.W|jd}|dk r|t||d<x&t|jD]}|j||d|<qWx|j D]}||krd||<qW|f|S) a Create a pool key out of a request context dictionary. According to RFC 3986, both the scheme and host are case-insensitive. Therefore, this function normalizes both before constructing the pool key for an HTTPS request. If you wish to change this behaviour, provide alternate callables to ``key_fn_by_scheme``. :param key_class: The class to use when constructing the key. This should be a namedtuple with the ``scheme`` and ``host`` keys at a minimum. :type key_class: namedtuple :param request_context: A dictionary-like object that contain the context for a request. :type request_context: dict :return: A namedtuple that can be used as a connection pool key. :rtype: PoolKey schemehostheaders_proxy_headers_socks_optionsNsocket_optionskey_)r5r6r7) copylower frozensetitemsgettuplelistkeyspop_fields) key_classrequest_contextcontextkey socket_optsfieldrJl/private/var/folders/pf/wv4htv3x0qs2c2mp0dnn0kchsvlck3/T/pip-install-emcbgzcf/urllib3/urllib3/poolmanager.py_default_key_normalizer;s     rL)httphttpsc@sxeZdZdZdZdddZddZdd Zdd d Zd d Z dddZ ddZ dddZ d ddZ ddZd!ddZdS)"ra$ Allows for arbitrary requests while transparently keeping track of necessary connection pools for you. :param num_pools: Number of connection pools to cache before discarding the least recently used pool. :param headers: Headers to include with all requests, unless other headers are given explicitly. :param \**connection_pool_kw: Additional parameters are used to create fresh :class:`urllib3.connectionpool.ConnectionPool` instances. Example:: >>> manager = PoolManager(num_pools=2) >>> r = manager.request('GET', 'http://google.com/') >>> r = manager.request('GET', 'http://google.com/mail') >>> r = manager.request('GET', 'http://yahoo.com/') >>> len(manager.pools) 2 N cKs8tj||||_t|ddd|_t|_tj|_dS)NcSs|jS)N)close)prJrJrKsz&PoolManager.__init__..) dispose_func)r __init__connection_pool_kwrpoolspool_classes_by_schemekey_fn_by_schemer:)self num_poolsr5rUrJrJrKrTs  zPoolManager.__init__cCs|S)NrJ)rYrJrJrK __enter__szPoolManager.__enter__cCs |jdS)NF)clear)rYexc_typeexc_valexc_tbrJrJrK__exit__szPoolManager.__exit__cCsf|j|}|dkr|jj}xdD]}|j|dq"W|dkrXxtD]}|j|dqDW|||f|S)a Create a new :class:`ConnectionPool` based on host, port, scheme, and any additional pool keyword arguments. If ``request_context`` is provided, it is provided as keyword arguments to the pool class used. This method is used to actually create the connection pools handed out by :meth:`connection_from_url` and companion methods. It is intended to be overridden for customization. Nr3r4portrM)r3r4ra)rWrUr:rB SSL_KEYWORDS)rYr3r4rarEpool_clsrGkwrJrJrK _new_pools    zPoolManager._new_poolcCs|jjdS)z Empty our store of pools and direct them all to close. This will not affect in-flight connections, but they will not be re-used after completion. N)rVr\)rYrJrJrKr\szPoolManager.clearrMcCsT|s td|j|}|pd|d<|s:tj|djd}||d<||d<|j|S)a Get a :class:`ConnectionPool` based on the host, port, and scheme. If ``port`` isn't given, it will be derived from the ``scheme`` using ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is provided, it is merged with the instance's ``connection_pool_kw`` variable and used to create the new connection pool, if one is needed. zNo host specified.rMr3Prar4)r_merge_pool_kwargsrr>r;connection_from_context)rYr4rar3 pool_kwargsrErJrJrKconnection_from_hosts   z PoolManager.connection_from_hostcCs,|dj}|j|}||}|j||dS)z Get a :class:`ConnectionPool` based on the request context. ``request_context`` must at least contain the ``scheme`` key and its value must be a key in ``key_fn_by_scheme`` instance variable. r3)rE)r;rXconnection_from_pool_key)rYrEr3pool_key_constructorpool_keyrJrJrKrhs  z#PoolManager.connection_from_contextc Cs`|jjN|jj|}|r|S|d}|d}|d}|j||||d}||j|<WdQRX|S)z Get a :class:`ConnectionPool` based on the provided pool key. ``pool_key`` should be a namedtuple that only contains immutable objects. At a minimum it must have the ``scheme``, ``host``, and ``port`` fields. r3r4ra)rEN)rVlockr>re)rYrmrEpoolr3r4rarJrJrKrks  z$PoolManager.connection_from_pool_keycCs t|}|j|j|j|j|dS)a Similar to :func:`urllib3.connectionpool.connection_from_url`. If ``pool_kwargs`` is not provided and a new pool needs to be constructed, ``self.connection_pool_kw`` is used to initialize the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` is provided, it is used instead. Note that if a new pool does not need to be created for the request, the provided ``pool_kwargs`` are not used. )rar3ri)rrjr4rar3)rYurlriurJrJrKconnection_from_url s zPoolManager.connection_from_urlc CsZ|jj}|rVxF|jD]:\}}|dkrJy ||=WqRtk rFYqRXq|||<qW|S)a Merge a dictionary of override values for self.connection_pool_kw. This does not modify self.connection_pool_kw and returns a new dict. Any keys in the override dictionary with a value of ``None`` are removed from the merged dictionary. N)rUr:r=KeyError)rYoverridebase_pool_kwargsrGvaluerJrJrKrgs   zPoolManager._merge_pool_kwargsTc Kst|}|j|j|j|jd}d|d<d|d<d|krD|jj|d<|jdk rj|jdkrj|j||f|}n|j||j f|}|o|j }|s|St ||}|j dkrd }|j d } t| tstj| |d } | jo|j| rttj|d} x*| D]"} | j| jkr|dj| dqWy| j||||d } Wn tk rR| jrN|SX| |d <||d<tjd |||j||f|S)a] Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` with custom cross-host redirect logic and only sends the request-uri portion of the ``url``. The given ``url`` parameter must be absolute, such that an appropriate :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. )rar3Fassert_same_hostredirectr5NrMi/GETretries)rx)response_poolzRedirecting %s -> %s)rrjr4rar3r5r:proxyurlopen request_uriget_redirect_locationr statusr> isinstancerfrom_intremove_headers_on_redirect is_same_hostr@r iterkeysr;rB incrementr raise_on_redirectloginfo) rYmethodrprxrdrqconnr{redirect_locationrzr5headerrJrJrKr~/sD       zPoolManager.urlopen)rON)N)NrMN)N)N)T)__name__ __module__ __qualname____doc__r}rTr[r`rer\rjrhrkrrrgr~rJrJrJrKr{s     csHeZdZdZdfdd Zdfdd Zdd d Zdfd d ZZS)rax Behaves just like :class:`PoolManager`, but sends all requests through the defined proxy, using the CONNECT method for HTTPS URLs. :param proxy_url: The URL of the proxy to be used. :param proxy_headers: A dictionary containing headers that will be sent to the proxy. In case of HTTP they are being sent with each request, while in the HTTPS/CONNECT case they are sent only once. Could be used for proxy authentication. Example: >>> proxy = urllib3.ProxyManager('http://localhost:3128/') >>> r1 = proxy.request('GET', 'http://google.com/') >>> r2 = proxy.request('GET', 'http://httpbin.org/') >>> len(proxy.pools) 1 >>> r3 = proxy.request('GET', 'https://httpbin.org/') >>> r4 = proxy.request('GET', 'https://twitter.com/') >>> len(proxy.pools) 3 rONc st|trd|j|j|jf}t|}|jsFtj|jd}|j|d}|jdkrZt |j||_ |pfi|_ |j |d<|j |d<t t |j||f|dS) Nz %s://%s:%irf)rarMrN_proxyr6)rMrN)rrr3r4rarrr>_replacer r} proxy_headerssuperrrT)rY proxy_urlrZr5rrUr}ra) __class__rJrKrTs          zProxyManager.__init__rMcsD|dkr tt|j||||dStt|j|jj|jj|jj|dS)NrN)ri)rrrjr}r4rar3)rYr4rar3ri)rrJrKrjs   z!ProxyManager.connection_from_hostcCs0ddi}t|j}|r||d<|r,|j||S)z Sets headers needed by proxies: specifically, the Accept and Host headers. Only sets headers not provided by the user. Acceptz*/*Host)rnetlocupdate)rYrpr5headers_rrJrJrK_set_proxy_headerss  zProxyManager._set_proxy_headersTc sNt|}|jdkr0|jd|j}|j|||d<tt|j||fd|i|S)z@Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute.rMr5rx)rr3r>r5rrrr~)rYrrprxrdrqr5)rrJrKr~s  zProxyManager.urlopen)rONN)NrMN)N)T) rrrrrTrjrr~ __classcell__rJrJ)rrKrms  cKstfd|i|S)Nr)r)rprdrJrJrKrs)rrrrrrr)rrrrrrr r!r"r#r$r%r&r'r(r)r*r+r,r-r.r/r0r1)( __future__r collections functoolslogging _collectionsrconnectionpoolrrr exceptionsrr r packagesr Zpackages.six.moves.urllib.parser requestr Zutil.urlrZ util.retryr__all__ getLoggerrrrb _key_fields namedtupler2rLpartialrXrWrrrrJrJrJrKsd           6 sW