
) X9)                 @   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   V/home/ubuntu/projects/ifolica/build/requests/requests/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   s7   |  j  ( |  j j |  } | |  j | <| SWd  QXd  S)N)r   r   pop)r   keyitemr   r   r   __getitem__2   s    
z!RecentlyUsedContainer.__getitem__c          
   C   s   t  } |  j ] |  j j | t   } | |  j | <t |  j  |  j k rh |  j j d d  \ } } n  Wd  QX|  j r | t  k	 r |  j |  n  d  S)NlastF)_Nullr   r   getlenr   popitemr   )r   r!   valueevicted_value_keyr   r   r   __setitem__9   s    
$z!RecentlyUsedContainer.__setitem__c          	   C   s?   |  j   |  j j |  } Wd  QX|  j r; |  j |  n  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  QXd  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  QX|  j r\ x | D] } |  j |  qB Wn  d  S)N)r   listr   r   clearr   )r   valuesr)   r   r   r   r2   V   s    
	zRecentlyUsedContainer.clearc          
   C   s'   |  j   t t |  j   SWd  QXd  S)N)r   r1   r   r   )r   r   r   r   keys`   s    
zRecentlyUsedContainer.keys)r   r   r   __doc__r   r   r   r#   r,   r-   r.   r0   r2   r4   r   r   r   r   r      s   
c                   sZ  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 n  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                st   t  t |   j   t   |  _ | d  k	 rZ t | t  rJ |  j |  qZ |  j |  n  | rp |  j |  n  d  S)N)superr   r   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 |    sN t |   |  } n  t d d   |  j   D  t d d   | j   D  k S)Nr4   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=   )rA   rB   rC   r   r   r   rD      s    )r7   r   hasattrtypedict
itermerged)r   otherr   r   r   __eq__   s     zHTTPHeaderDict.__eq__c             C   s   |  j  |  S)N)rJ   )r   rI   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   r3   )r   valsr   r   r   r0      s    zHTTPHeaderDict.__iter__c             C   sK   y |  | } Wn+ t  k
 r; | |  j k r3   n  | 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)rM   )r   r!   r   r   r   discard   s    zHTTPHeaderDict.discardc             C   s}   | j    } | | f } |  j j | |  } | | k	 ry t | t  rX | j |  qy | d | d | g |  j | <n  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   
setdefaultr7   r1   append)r   r!   r>   Z	key_lowerZnew_valsrL   r   r   r   add   s    	zHTTPHeaderDict.addc             O   s]  t  |  d k r0 t d j t  |     n  t  |  d k rL | d n f  } t | t  r x | j   D] \ } } |  j | |  qn 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 | |  q9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   r4   N)r'   	TypeErrorformatr7   r   	iteritemsrS   r   rE   r4   items)r   argsr;   rI   r!   r>   r)   r   r   r   r9      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=   rM   r7   tuple)r   r!   rL   r   r   r   getlist  s    	zHTTPHeaderDict.getlistc             C   s#   d t  |   j t |  j    f S)Nz%s(%s))rF   r   rG   rH   )r   r   r   r   __repr__  s    zHTTPHeaderDict.__repr__c             C   s\   xU | D]M } | j  |  } t | t  r: t |  } n  | g | |  j | j   <q Wd  S)N)rZ   r7   r1   r   r=   )r   rI   r!   r>   r   r   r   r8     s
    zHTTPHeaderDict._copy_fromc             C   s    t  |     } | j |   | S)N)rF   r8   )r   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!   rL   r>   r   r   r   rV   #  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   rH   *  s    zHTTPHeaderDict.itermergedc             C   s   t  |  j    S)N)r1   rV   )r   r   r   r   rW   0  s    zHTTPHeaderDict.itemsc             C   s   g  } x | j  D]z } | j d  rY | d \ } } | | d | j   f | d <q n  | j d d  \ } } | j | | j   f  q W|  |  S)	z4Read headers from a Python 2 httplib message object. 	r   z
:)r^   r_   ra   )r:   
startswithrstripsplitrR   strip)clsmessager:   liner!   r)   r   r   r   from_httplib3  s    zHTTPHeaderDict.from_httplib)#r   r   r   r5   r   r,   r#   r-   r@   rJ   rK   r   r   r   r   objectrN   r.   r0   r    rP   rS   r9   rZ   
getheadersgetallmatchingheadersZigetr[   r8   r]   rV   rH   rW   classmethodri   r   r   )r<   r   r   e   s:    		N)
__future__r   collectionsr   r   	threadingr   ImportErrorr   Zpackages.ordered_dictZpackages.sixr   r   r   __all__rj   r%   r   r   r   r   r   r   <module>   s   	J