
]'v_$)                 @   s   d  d l  m Z d  d l m Z m Z y d  d l m Z Wn% e k
 ra Gd d   d  Z Yn Xy d  d l m Z Wn" e k
 r d d l	 m Z Yn Xd  d l
 m Z m Z m Z d	 d
 g Z e   Z Gd d	   d	 e  Z Gd d
   d
 e  Z d S)    )absolute_import)MappingMutableMapping)RLockc               @   s(   e  Z d  Z d d   Z d d   Z d S)r   c             C   s   d  S)N )selfr   r   6/usr/lib/python3/dist-packages/urllib3/_collections.py	__enter__   s    zRLock.__enter__c             C   s   d  S)Nr   )r   exc_type	exc_value	tracebackr   r   r   __exit__
   s    zRLock.__exit__N)__name__
__module____qualname__r	   r   r   r   r   r   r      s   r   )OrderedDict   )iterkeys
itervaluesPY3RecentlyUsedContainerHTTPHeaderDictc               @   s   e  Z d  Z d Z e Z d d d d  Z d d   Z d d	   Z d
 d   Z	 d d   Z
 d d   Z d d   Z d d   Z d S)r   a  
    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
    
   Nc             C   s1   | |  _  | |  _ |  j   |  _ t   |  _ d  S)N)_maxsizedispose_funcContainerCls
_containerr   lock)r   maxsizer   r   r   r   __init__+   s    		zRecentlyUsedContainer.__init__c          
   C   s8   |  j  ( |  j j |  } | |  j | <| SWd  QRXd  S)N)r   r   pop)r   keyitemr   r   r   __getitem__2   s    
z!RecentlyUsedContainer.__getitem__c          
   C   s   t  } |  j Z |  j j | t   } | |  j | <t |  j  |  j k re |  j j d d  \ } } Wd  QRX|  j r | t  k	 r |  j |  d  S)NZlastF)_Nullr   r   getlenr   popitemr   )r   r!   valueZevicted_valueZ_keyr   r   r   __setitem__9   s    
"z!RecentlyUsedContainer.__setitem__c          	   C   s=   |  j   |  j j |  } Wd  QRX|  j r9 |  j |  d  S)N)r   r   r    r   )r   r!   r(   r   r   r   __delitem__H   s    
	z!RecentlyUsedContainer.__delitem__c          	   C   s"   |  j   t |  j  SWd  QRXd  S)N)r   r&   r   )r   r   r   r   __len__O   s    
zRecentlyUsedContainer.__len__c             C   s   t  d   d  S)Nz7Iteration over this class is unlikely to be threadsafe.)NotImplementedError)r   r   r   r   __iter__S   s    zRecentlyUsedContainer.__iter__c          
   C   s^   |  j  ' t t |  j   } |  j j   Wd  QRX|  j rZ x | D] } |  j |  qC Wd  S)N)r   listr   r   clearr   )r   valuesr(   r   r   r   r/   V   s    
	zRecentlyUsedContainer.clearc          
   C   s(   |  j   t t |  j   SWd  QRXd  S)N)r   r.   r   r   )r   r   r   r   keys`   s    
zRecentlyUsedContainer.keys)r   r   r   __doc__r   r   r   r#   r)   r*   r+   r-   r/   r1   r   r   r   r   r      s   
c                   sW  e  Z d  Z d Z d   f d d  Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	 d d   Z
 e s e j Z e j Z e   Z d d   Z d d   Z e d d  Z d d   Z d d   Z d d   Z d d   Z e Z e Z e Z d d    Z d! d"   Z d# d$   Z d% d&   Z d' d(   Z d) d*   Z  e! d+ d,    Z"   S)-r   ap  
    :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'
    Nc                sk   t  t |   j   i  |  _ | d  k	 rT t | t  rG |  j |  n |  j |  | rg |  j |  d  S)N)superr   r   r   
isinstance
_copy_fromextend)r   headerskwargs)	__class__r   r   r      s    	zHTTPHeaderDict.__init__c             C   s*   | | f |  j  | j   <|  j  | j   S)N)r   lower)r   r!   valr   r   r   r)      s    zHTTPHeaderDict.__setitem__c             C   s*   |  j  | j   } d j | d d    S)Nz, r   )r   r:   join)r   r!   r;   r   r   r   r#      s    zHTTPHeaderDict.__getitem__c             C   s   |  j  | j   =d  S)N)r   r:   )r   r!   r   r   r   r*      s    zHTTPHeaderDict.__delitem__c             C   s   | j    |  j k S)N)r:   r   )r   r!   r   r   r   __contains__   s    zHTTPHeaderDict.__contains__c             C   s   t  | t  r$ t | d  r$ d St  | t |    sK t |   |  } t d d   |  j   D  t d d   | j   D  k S)Nr1   Fc             s   s'   |  ] \ } } | j    | f Vq d  S)N)r:   ).0kvr   r   r   	<genexpr>   s    z(HTTPHeaderDict.__eq__.<locals>.<genexpr>c             s   s'   |  ] \ } } | j    | f Vq d  S)N)r:   )r>   r?   r@   r   r   r   rA      s    )r4   r   hasattrtypedict
itermerged)r   otherr   r   r   __eq__   s     zHTTPHeaderDict.__eq__c             C   s   |  j  |  S)N)rG   )r   rF   r   r   r   __ne__   s    zHTTPHeaderDict.__ne__c             C   s   t  |  j  S)N)r&   r   )r   r   r   r   r+      s    zHTTPHeaderDict.__len__c             c   s'   x  |  j  j   D] } | d Vq Wd  S)Nr   )r   r0   )r   valsr   r   r   r-      s    zHTTPHeaderDict.__iter__c             C   sH   y |  | } Wn( t  k
 r8 | |  j k r0   | SYn X|  | =| Sd S)zD.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)KeyError_HTTPHeaderDict__marker)r   r!   defaultr(   r   r   r   r       s    	zHTTPHeaderDict.popc             C   s$   y |  | =Wn t  k
 r Yn Xd  S)N)rJ   )r   r!   r   r   r   discard   s    zHTTPHeaderDict.discardc             C   sz   | j    } | | f } |  j j | |  } | | k	 rv t | t  rX | j |  n | d | d | g |  j | <d S)zAdds 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'
        r   r   N)r:   r   
setdefaultr4   r.   append)r   r!   r;   Z	key_lowerZnew_valsrI   r   r   r   add   s    	zHTTPHeaderDict.addc             O   sZ  t  |  d k r- t d j t  |     t  |  d k rI | d n f  } t | t  r x | j   D] \ } } |  j | |  qk Wn 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 | |  q6Wd S)zGeneric 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__
        r   z9extend() takes at most 1 positional arguments ({0} given)r   r1   N)r&   	TypeErrorformatr4   r   	iteritemsrP   r   rB   r1   items)r   argsr8   rF   r!   r;   r(   r   r   r   r6      s"    	"zHTTPHeaderDict.extendc             C   s\   y |  j  | j   } Wn t k
 r/ g  SYn) Xt | t  rJ | d g S| d d  Sd S)zmReturns a list of all the values for the named field. Returns an
        empty list if the key doesn't exist.r   N)r   r:   rJ   r4   tuple)r   r!   rI   r   r   r   getlist  s    	zHTTPHeaderDict.getlistc             C   s#   d t  |   j t |  j    f S)Nz%s(%s))rC   r   rD   rE   )r   r   r   r   __repr__  s    zHTTPHeaderDict.__repr__c             C   sY   xR | D]J } | j  |  } t | t  r7 t |  } | g | |  j | j   <q Wd  S)N)rW   r4   r.   r   r:   )r   rF   r!   r;   r   r   r   r5     s
    zHTTPHeaderDict._copy_fromc             C   s    t  |     } | j |   | S)N)rC   r5   )r   Zcloner   r   r   copy  s    zHTTPHeaderDict.copyc             c   sR   xK |  D]C } |  j  | j   } x' | d d  D] } | d | f Vq1 Wq Wd S)z8Iterate over all header lines, including duplicate ones.r   Nr   )r   r:   )r   r!   rI   r;   r   r   r   rS   #  s    zHTTPHeaderDict.iteritemsc             c   sJ   xC |  D]; } |  j  | j   } | d d j | d d   f Vq Wd S)z:Iterate over all headers, merging duplicate ones together.r   z, r   N)r   r:   r<   )r   r!   r;   r   r   r   rE   *  s    zHTTPHeaderDict.itermergedc             C   s   t  |  j    S)N)r.   rS   )r   r   r   r   rT   0  s    zHTTPHeaderDict.itemsc             C   s   g  } x | j  D]w } | j d  rV | d \ } } | | d | j   f | d <q | j d d  \ } } | j | | j   f  q W|  |  S)	z4Read headers from a Python 2 httplib message object. 	r   z
:)rZ   r[   r]   )r7   
startswithrstripsplitrO   strip)clsmessager7   liner!   r(   r   r   r   from_httplib3  s    zHTTPHeaderDict.from_httplib)#r   r   r   r2   r   r)   r#   r*   r=   rG   rH   r   r   r   r   objectrK   r+   r-   r    rM   rP   r6   rW   Z
getheadersZgetallmatchingheadersZigetrX   r5   rY   rS   rE   rT   classmethodre   r   r   )r9   r   r   e   s:    			N)Z
__future__r   collectionsr   r   Z	threadingr   ImportErrorr   Zpackages.ordered_dictZsixr   r   r   __all__rf   r$   r   r   r   r   r   r   <module>   s   	J