σ
°u\Wc           @@  sΨ  d  d l  m Z d  d l Z d  d l Z d  d l Z y d  d l m Z Wn! e k
 rk d  d l m Z n Xd d l	 m
 Z
 d d l m Z m Z d d l m Z d d l m Z m Z m Z d d	 l m Z d d
 l m Z d d l m Z d d d g Z e j e  Z d& Z e j d d'  Z e j d e j  d(  Z! e j d e! j  e  Z" d    Z# i e j$ e# e!  d! 6e j$ e# e"  d" 6Z% i e d! 6e d" 6Z& d e f d#     YZ' d e' f d$     YZ( d%   Z) d S()   i    (   t   absolute_importN(   t   urljoini   (   t   RecentlyUsedContainer(   t   HTTPConnectionPoolt   HTTPSConnectionPool(   t   port_by_scheme(   t   LocationValueErrort   MaxRetryErrort   ProxySchemeUnknown(   t   RequestMethods(   t	   parse_url(   t   Retryt   PoolManagert   ProxyManagert   proxy_from_urlt   key_filet	   cert_filet	   cert_reqst   ca_certst   ssl_versiont   ca_cert_dirt   BasePoolKeyt   schemet   hostt   portt   HTTPPoolKeyt   timeoutt   retriest   strictt   blockt   source_addresst   HTTPSPoolKeyc         C@  s_   i  } x$ |  j  D] } | j |  | | <q W| d j   | d <| d j   | d <|  |   S(   s¦  
    Create a pool key of type ``key_class`` for a request.

    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.

    :param request_context:
        A dictionary-like object that contain the context for a request.
        It should contain a key for each field in the :class:`HTTPPoolKey`
    R   R   (   t   _fieldst   gett   lower(   t	   key_classt   request_contextt   contextt   key(    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyt   _default_key_normalizer/   s    t   httpt   httpsc           B@  s}   e  Z d  Z d Z d d d  Z d   Z d   Z d   Z d   Z	 d d d  Z
 d	   Z d
   Z d   Z e d  Z RS(   s$  
    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

    i
   c         K@  sM   t  j |  |  | |  _ t | d d   |  _ t |  _ t j   |  _ d  S(   Nt   dispose_funcc         S@  s
   |  j    S(   N(   t   close(   t   p(    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyt   <lambda>y   s    (   R	   t   __init__t   connection_pool_kwR   t   poolst   pool_classes_by_schemet   key_fn_by_schemet   copy(   t   selft	   num_poolst   headersR/   (    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyR.   u   s    			c         C@  s   |  S(   N(    (   R4   (    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyt	   __enter__   s    c         C@  s   |  j    t S(   N(   t   cleart   False(   R4   t   exc_typet   exc_valt   exc_tb(    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyt   __exit__   s    
c         C@  se   |  j  | } |  j } | d k rU |  j j   } x! t D] } | j | d  q8 Wn  | | | |  S(   s  
        Create a new :class:`ConnectionPool` based on host, port and scheme.

        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.
        R(   N(   R1   R/   R3   t   SSL_KEYWORDSt   popt   None(   R4   R   R   R   t   pool_clst   kwargst   kw(    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyt	   _new_pool   s    	c         C@  s   |  j  j   d S(   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(   R0   R8   (   R4   (    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyR8      s    R(   c         C@  sz   | s t  d   n  |  j j   } | p- d | d <| sY t j | d j   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``.
        s   No host specified.R(   R   iP   R   R   (   R   R/   R3   R   R!   R"   t   connection_from_context(   R4   R   R   R   R$   (    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyt   connection_from_host’   s    

c         C@  s6   | d j    } |  j | } | |  } |  j |  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.
        R   (   R"   R2   t   connection_from_pool_key(   R4   R$   R   t   pool_key_constructort   pool_key(    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyRE   Ά   s    c         C@  s^   |  j  j L |  j  j |  } | r) | S|  j | j | j | j  } | |  j  | <Wd QX| S(   sϋ   
        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.
        N(   R0   t   lockR!   RD   R   R   R   (   R4   RI   t   pool(    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyRG   Γ   s    c         C@  s.   t  |  } |  j | j d | j d | j S(   s*  
        Similar to :func:`urllib3.connectionpool.connection_from_url` but
        doesn't pass any additional parameters to the
        :class:`urllib3.connectionpool.ConnectionPool` constructor.

        Additional parameters are taken from the :class:`.PoolManager`
        constructor.
        R   R   (   R
   RF   R   R   R   (   R4   t   urlt   u(    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyt   connection_from_urlΨ   s    	c   
      K@  s§  t  |  } |  j | j d | j d | j } t | d <t | d <d | k r` |  j | d <n  |  j d k	 r | j d k r | j	 | | |  } n | j	 | | j
 |  } | o½ | j   } | sΚ | St | |  } | j d k rρ d } n  | j d	  }	 t |	 t  s't j |	 d | }	 n  y" |	 j | | d
 | d | }	 Wn! t k
 rl|	 j rh  n  | SX|	 | d	 <| | d <t j d | |  |  j	 | | |  S(   s]  
        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.
        R   R   t   assert_same_hostt   redirectR6   R(   i/  t   GETR   t   responset   _pools   Redirecting %s -> %sN(   R
   RF   R   R   R   R9   R6   t   proxyR@   t   urlopent   request_urit   get_redirect_locationR   t   statusR!   t
   isinstanceR   t   from_intt	   incrementR   t   raise_on_redirectt   logt   info(
   R4   t   methodRL   RP   RC   RM   t   connRR   t   redirect_locationR   (    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyRU   δ   s8    	$

	"	

N(   t   __name__t
   __module__t   __doc__R@   RT   R.   R7   R=   RD   R8   RF   RE   RG   RN   t   TrueRU   (    (    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyR   W   s   								c           B@  sG   e  Z d  Z d d d d  Z d d d  Z d d  Z e d  Z RS(   sw  
    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 contaning 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
   c         K@  sΰ   t  | t  r. d | j | j | j f } n  t |  } | j sm t j | j d  } | j d |  } n  | j d k r t	 | j   n  | |  _
 | p  i  |  _ |  j
 | d <|  j | d <t t |   j | | |  d  S(	   Ns
   %s://%s:%iiP   R   R(   R)   t   _proxyt   _proxy_headers(   s   httpR)   (   RY   R   R   R   R   R
   R   R!   t   _replaceR   RT   t   proxy_headerst   superR   R.   (   R4   t	   proxy_urlR5   R6   Ri   R/   RT   R   (    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyR.   2  s    		R(   c         C@  sV   | d k r( t  t |   j | | |  St  t |   j |  j j |  j j |  j j  S(   NR)   (   Rj   R   RF   RT   R   R   R   (   R4   R   R   R   (    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyRF   I  s
    c         C@  sI   i d d 6} t  |  j } | r/ | | d <n  | rE | j |  n  | S(   s   
        Sets headers needed by proxies: specifically, the Accept and Host
        headers. Only sets headers not provided by the user.
        s   */*t   Acceptt   Host(   R
   t   netloct   update(   R4   RL   R6   t   headers_Rn   (    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyt   _set_proxy_headersQ  s    c         K@  sk   t  |  } | j d k rI | j d |  j  } |  j | |  | d <n  t t |   j | | d | | S(   s@   Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute.R(   R6   RP   (   R
   R   R!   R6   Rq   Rj   R   RU   (   R4   R_   RL   RP   RC   RM   R6   (    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyRU   `  s
    N(	   Rb   Rc   Rd   R@   R.   RF   Rq   Re   RU   (    (    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyR     s   c         K@  s   t  d |  |  S(   NRk   (   R   (   RL   RC   (    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyR   n  s    (   R   R   R   R   R   R   (   s   schemes   hosts   port(   R   s   retriess   stricts   blockR   (*   t
   __future__R    t   collectionst	   functoolst   loggingt   urllib.parseR   t   ImportErrort   urlparset   _collectionsR   t   connectionpoolR   R   R   t
   exceptionsR   R   R   t   requestR	   t   util.urlR
   t
   util.retryR   t   __all__t	   getLoggerRb   R]   R>   t
   namedtupleR   R    R   R   R'   t   partialR2   R1   R   R   R   (    (    (    s7   /usr/lib/python2.7/dist-packages/urllib3/poolmanager.pyt   <module>   sD    	
	
ΐW