ó
_XîTc           @   s,  d  d l  m Z m Z y d  d l m Z Wn$ e k
 rP d d d „  ƒ  YZ n Xy d  d l  m Z Wn! e k
 rˆ d d l m Z n Xd d l m	 Z	 m
 Z
 m Z d d	 g Z e d
 d d g ƒ Z e ƒ  Z d e f d „  ƒ  YZ e j Z e j Z e j Z e j Z e j Z d	 e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   Mappingt   MutableMapping(   t   RLockR   c           B   s   e  Z d  „  Z d „  Z RS(   c         C   s   d  S(   N(    (   t   self(    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt	   __enter__   s    c         C   s   d  S(   N(    (   R   t   exc_typet	   exc_valuet	   traceback(    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   __exit__	   s    (   t   __name__t
   __module__R   R   (    (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyR      s   	(   t   OrderedDicti   (   t   iterkeyst
   itervaluest   PY3t   RecentlyUsedContainert   HTTPHeaderDictt   cookies
   set-cookies   set-cookie2c           B   sb   e  Z d  Z e Z d d
 d „ Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d „  Z d	 „  Z RS(   s‘  
    Provides a thread-safe dict-like container which maintains up to
    ``maxsize`` keys while throwing away the least-recently-used keys beyond
    ``maxsize``.

    :param maxsize:
        Maximum number of recent elements to retain.

    :param dispose_func:
        Every time an item is evicted from the container,
        ``dispose_func(value)`` is called.  Callback which will get called
    i
   c         C   s1   | |  _  | |  _ |  j ƒ  |  _ t ƒ  |  _ d  S(   N(   t   _maxsizet   dispose_funct   ContainerClst
   _containerR   t   lock(   R   t   maxsizeR   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   __init__,   s    		c         C   s7   |  j  ( |  j j | ƒ } | |  j | <| SWd  QXd  S(   N(   R   R   t   pop(   R   t   keyt   item(    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   __getitem__3   s    
c         C   s—   t  } |  j ] |  j j | t  ƒ } | |  j | <t |  j ƒ |  j k rh |  j j d t ƒ \ } } n  Wd  QX|  j r“ | t  k	 r“ |  j | ƒ n  d  S(   Nt   last(	   t   _NullR   R   t   gett   lenR   t   popitemt   FalseR   (   R   R   t   valuet   evicted_valuet   _key(    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   __setitem__:   s    
$c         C   s?   |  j   |  j j | ƒ } Wd  QX|  j r; |  j | ƒ n  d  S(   N(   R   R   R   R   (   R   R   R#   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   __delitem__I   s    
	c         C   s!   |  j   t |  j ƒ SWd  QXd  S(   N(   R   R    R   (   R   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   __len__P   s    
c         C   s   t  d ƒ ‚ d  S(   Ns7   Iteration over this class is unlikely to be threadsafe.(   t   NotImplementedError(   R   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   __iter__T   s    c         C   s`   |  j  ' t t |  j ƒ ƒ } |  j j ƒ  Wd  QX|  j r\ x | D] } |  j | ƒ qB Wn  d  S(   N(   R   t   listR   R   t   clearR   (   R   t   valuesR#   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyR,   W   s    
	c         C   s'   |  j   t t |  j ƒ ƒ SWd  QXd  S(   N(   R   R+   R   R   (   R   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   keysa   s    
N(   R	   R
   t   __doc__R   R   t   NoneR   R   R&   R'   R(   R*   R,   R.   (    (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyR      s   						
c           B   s  e  Z d  Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 e j Z e j Z e j Z e s„ e j Z e j Z n  e ƒ  Z e d „ Z d	 „  Z d
 „  Z d „  Z d „  Z e Z e Z e Z d „  Z d „  Z d „  Z d „  Z d „  Z  e! d d „ ƒ Z" RS(   sp  
    :param headers:
        An iterable of field-value pairs. Must not contain multiple field names
        when compared case-insensitively.

    :param kwargs:
        Additional field-value pairs to pass in to ``dict.update``.

    A ``dict`` like container for storing HTTP Headers.

    Field names are stored and compared case-insensitively in compliance with
    RFC 7230. Iteration provides the first case-sensitive key seen for each
    case-insensitive pair.

    Using ``__setitem__`` syntax overwrites fields that compare equal
    case-insensitively in order to maintain ``dict``'s api. For fields that
    compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add``
    in a loop.

    If multiple fields that are equal case-insensitively are passed to the
    constructor or ``.update``, the behavior is undefined and some will be
    lost.

    >>> headers = HTTPHeaderDict()
    >>> headers.add('Set-Cookie', 'foo=bar')
    >>> headers.add('set-cookie', 'baz=quxx')
    >>> headers['content-length'] = '7'
    >>> headers['SET-cookie']
    'foo=bar, baz=quxx'
    >>> headers['Content-Length']
    '7'
    c         K   sC   t  j |  ƒ | d  k	 r) |  j | ƒ n  | r? |  j | ƒ n  d  S(   N(   t   dictR   R0   t   extend(   R   t   headerst   kwargs(    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyR      s
    c         C   s   t  |  | j ƒ  | | f ƒ S(   N(   t   _dict_setitemt   lower(   R   R   t   val(    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyR&   –   s    c         C   s&   t  |  | j ƒ  ƒ } d j | d ƒ S(   Ns   , i   (   t   _dict_getitemR6   t   join(   R   R   R7   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyR   ™   s    c         C   s   t  |  | j ƒ  ƒ S(   N(   t   _dict_delitemR6   (   R   R   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyR'      s    c         C   s   t  |  | j ƒ  ƒ S(   N(   t   _dict_containsR6   (   R   R   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   __contains__    s    c            s„   t  ˆ  t ƒ r$ t ˆ  d ƒ r$ t St  ˆ  t ˆ ƒ ƒ sN t ˆ ƒ ˆ  ƒ ‰  n  t ‡ f d †  ˆ Dƒ ƒ t ‡  f d †  ˆ  Dƒ ƒ k S(   NR.   c         3   s   |  ] } | ˆ  | f Vq d  S(   N(    (   t   .0t   k1(   R   (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pys	   <genexpr>¨   s    c         3   s   |  ] } | ˆ  | f Vq d  S(   N(    (   R=   t   k2(   t   other(    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pys	   <genexpr>¨   s    (   t
   isinstanceR    t   hasattrR"   t   typeR1   (   R   R@   (    (   R@   R   s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   __eq__£   s
     c         C   s   |  j  | ƒ S(   N(   RD   (   R   R@   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   __ne__ª   s    c         C   sG   y |  | } Wn' t  k
 r7 | |  j k r3 ‚  n  | SX|  | =| Sd S(   s©   D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
          If key is not found, d is returned if given, otherwise KeyError is raised.
        N(   t   KeyErrort   _HTTPHeaderDict__marker(   R   R   t   defaultR#   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyR   ·   s    c         C   s#   y |  | =Wn t  k
 r n Xd  S(   N(   RF   (   R   R   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   discardÈ   s    c         C   sœ   | j  ƒ  } | | f } t |  | | ƒ } | | k	 r˜ t | t ƒ rU | j | ƒ q˜ | t k r… t |  | | d | d | g ƒ q˜ t |  | | ƒ n  d S(   sâ   Adds a (name, value) pair, doesn't overwrite the value if it already
        exists.

        >>> headers = HTTPHeaderDict(foo='bar')
        >>> headers.add('Foo', 'baz')
        >>> headers['foo']
        'bar, baz'
        i    i   N(   R6   t   _dict_setdefaultRA   R+   t   appendt   MULTIPLE_HEADERS_ALLOWEDR5   (   R   R   R7   t	   key_lowert   new_valst   vals(    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   addÎ   s    	$c          O   s=  t  |  ƒ d k r0 t d j t  |  ƒ ƒ ƒ ‚ n |  sE t d ƒ ‚ n  |  d } t  |  ƒ d k rk |  d n d } t | t ƒ r¨ x‰ | D] } | j | | | ƒ q‡ Wnd t | d ƒ rå xR | j ƒ  D] } | j | | | ƒ qÄ Wn' x$ | D] \ } } | j | | ƒ qì Wx* | j ƒ  D] \ } } | j | | ƒ qWd S(	   sÀ   Generic import function for any type of header-like object.
        Adapted version of MutableMapping.update in order to insert items
        with self.add instead of self.__setitem__
        i   s8   update() takes at most 2 positional arguments ({} given)s,   update() takes at least 1 argument (0 given)i    i   R.   N(    (	   R    t	   TypeErrort   formatRA   R    RP   RB   R.   t   items(   t   argsR4   R   R@   R   R#   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyR2   è   s"    	
"c         C   sT   y t  |  | j ƒ  ƒ } Wn t k
 r- g  SXt | t ƒ rH | d g S| d Sd S(   sm   Returns a list of all the values for the named field. Returns an
        empty list if the key doesn't exist.i   N(   R8   R6   RF   RA   t   tuple(   R   R   RO   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   getlist  s    c         C   s#   d t  |  ƒ j t |  j ƒ  ƒ f S(   Ns   %s(%s)(   RC   R	   R1   t
   itermerged(   R   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   __repr__  s    c         C   sa   t  |  ƒ ƒ  } xK |  D]C } t |  | ƒ } t | t ƒ rI t | ƒ } n  t | | | ƒ q W| S(   N(   RC   R8   RA   R+   R5   (   R   t   cloneR   R7   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   copy  s    c         c   sH   xA |  D]9 } t  |  | ƒ } x! | d D] } | d | f Vq' Wq Wd S(   s8   Iterate over all header lines, including duplicate ones.i   i    N(   R8   (   R   R   RO   R7   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt	   iteritems!  s    c         c   s@   x9 |  D]1 } t  |  | ƒ } | d d j | d ƒ f Vq Wd S(   s:   Iterate over all headers, merging duplicate ones together.i    s   , i   N(   R8   R9   (   R   R   R7   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyRW   (  s    c         C   s   t  |  j ƒ  ƒ S(   N(   R+   R[   (   R   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyRS   .  s    s
   set-cookiec         C   s_   |  | j  ƒ  ƒ } xF | D]> } | j | ƒ x' | j | ƒ D] } | j | | ƒ q< W| SWd S(   s4   Read headers from a Python 2 httplib message object.N(   RS   RI   t
   getheadersRP   (   t   clst   messaget
   duplicatest   retR   R7   (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   from_httplib1  s    N(   s
   set-cookie(#   R	   R
   R/   R0   R   R&   R   R'   R<   RD   RE   R   R-   R   t   updateR   R   R   t   objectRG   R   RI   RP   R2   RV   R\   t   getallmatchingheaderst   igetRX   RZ   R[   RW   RS   t   classmethodRa   (    (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyR   m   s<    																	
			N(    (   t   collectionsR    R   t	   threadingR   t   ImportErrorR   t   packages.ordered_dictt   packages.sixR   R   R   t   __all__t	   frozensetRL   Rc   R   R   R1   R&   R5   R   R8   R'   R:   R<   R;   t
   setdefaultRJ   R   (    (    (    s8   /usr/lib/python2.7/site-packages/urllib3/_collections.pyt   <module>   s&   	J					