๓ กfH^c@@s”ddlmZddlZddlZddlZddlmZddlmZm Z ddlm Z ddl m Z m Z mZddlmZdd lmZdd lmZdd lmZdd lmZd ddgZejeƒZd8Zd9Zejd1eƒZ d2„Z!iej"e!e ƒd36ej"e!e ƒd46Z#ied36e d46Z$d efd5„ƒYZ%de%fd6„ƒYZ&d7„Z'dS(:i(tabsolute_importNi(tRecentlyUsedContainer(tHTTPConnectionPooltHTTPSConnectionPool(tport_by_scheme(tLocationValueErrort MaxRetryErrortProxySchemeUnknown(tsix(turljoin(tRequestMethods(t parse_url(tRetryt PoolManagert ProxyManagertproxy_from_urltkey_filet cert_filet cert_reqstca_certst ssl_versiont ca_cert_dirt ssl_contextt key_passwordt key_schemetkey_hosttkey_portt key_timeoutt key_retriest key_strictt key_blocktkey_source_addresst key_key_filetkey_key_passwordt key_cert_filet key_cert_reqst key_ca_certstkey_ssl_versiontkey_ca_cert_dirtkey_ssl_contextt key_maxsizet key_headerst key__proxytkey__proxy_headerstkey_socket_optionstkey__socks_optionstkey_assert_hostnametkey_assert_fingerprinttkey_server_hostnametPoolKeycC@s|jƒ}|djƒ|d<|djƒ|d>> 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 i cK@sMtj||ƒ||_t|dd„ƒ|_t|_tjƒ|_dS(Nt dispose_funccS@s |jƒS(N(tclose(tp((surllib3/poolmanager.pytขs(R t__init__tconnection_pool_kwRtpoolstpool_classes_by_schemetkey_fn_by_schemeR9(tselft num_poolsR4RR((surllib3/poolmanager.pyRQŸs   cC@s|S(N((RV((surllib3/poolmanager.pyt __enter__ฉscC@s|jƒtS(N(tcleartFalse(RVtexc_typetexc_valtexc_tb((surllib3/poolmanager.pyt__exit__ฌs cC@sŒ|j|}|dkr+|jjƒ}nxdD]}|j|dƒq2W|dkr|x!tD]}|j|dƒq_Wn||||S(sท 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. R2R3tportRKN(R2R3R_(RTR;RRR9RBt SSL_KEYWORDS(RVR2R3R_REtpool_clsRGtkw((surllib3/poolmanager.pyt _new_poolฑs     cC@s|jjƒdS(sด 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(RSRY(RV((surllib3/poolmanager.pyRYฬsRKcC@sz|stdƒ‚n|j|ƒ}|p-d|d<|sYtj|djƒdƒ}n||d<||d<|j|ƒS(s 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. sNo host specified.RKR2iPR_R3(Rt_merge_pool_kwargsRR>R:tconnection_from_context(RVR3R_R2t pool_kwargsRE((surllib3/poolmanager.pytconnection_from_hostีs   cC@s<|djƒ}|j|}||ƒ}|j|d|ƒS(sโ 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. R2RE(R:RUtconnection_from_pool_key(RVRER2tpool_key_constructortpool_key((surllib3/poolmanager.pyRe์s  c C@sy|jjg|jj|ƒ}|r)|S|d}|d}|d}|j|||d|ƒ}||j|Rc(RVRjREtpoolR2R3R_((surllib3/poolmanager.pyRh๙s    cC@s4t|ƒ}|j|jd|jd|jd|ƒS(sึ 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. R_R2Rf(R RgR3R_R2(RVturlRftu((surllib3/poolmanager.pytconnection_from_urls cC@sq|jjƒ}|rmxU|jƒD]D\}}|dkr\y ||=Wqftk rXqfXq"||| %sN(R RgR3R_R2RZR4R9tproxyR;turlopent request_uritget_redirect_locationR tstatusR>t isinstanceR tfrom_inttremove_headers_on_redirectt is_same_hostR@RtiterkeysR:RBt incrementRtraise_on_redirecttlogtinfo( RVtmethodRmRuRbRntconnRxtredirect_locationRwR4theader((surllib3/poolmanager.pyR{5sD $      "    N(t__name__t __module__t__doc__R;RzRQRXR^RcRYRgReRhRoRdtTrueR{(((surllib3/poolmanager.pyR s       cB@sJeZdZdddd„Zdddd„Zdd„Zed„ZRS(sx 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 i cK@sเt|tƒr.d|j|j|jf}nt|ƒ}|jsmtj|jdƒ}|jd|ƒ}n|jdkrŽt |jƒ‚n||_ |p i|_ |j |d<|j |dt_replaceRRzt proxy_headerstsuperRRQ(RVt proxy_urlRWR4R’RRRzR_((surllib3/poolmanager.pyRQs      RKcC@sb|dkr.tt|ƒj|||d|ƒStt|ƒj|jj|jj|jjd|ƒS(NRLRf(R“RRgRzR3R_R2(RVR3R_R2Rf((surllib3/poolmanager.pyRgฎs  cC@sIidd6}t|ƒj}|r/||dR4RšR“RR{(RVRˆRmRuRbRnR4((surllib3/poolmanager.pyR{วs  N( RŒRRŽR;RQRgRšRR{(((surllib3/poolmanager.pyRts  cK@std||S(NR”(R(RmRb((surllib3/poolmanager.pyRีs(RRRRRRRR(RRRRRRRRR R!R"R#R$R%R&R'R(R)R*R+R,R-R.R/R0((t __future__Rt collectionst functoolstloggingt _collectionsRtconnectionpoolRRRt exceptionsRRRtpackagesRtpackages.six.moves.urllib.parseR trequestR tutil.urlR t util.retryR t__all__t getLoggerRŒR†R`t _key_fieldst namedtupleR1RJtpartialRURTR RR(((surllib3/poolmanager.pytsp    5๓a