
Kh;*                 @   s  d  d l  m Z y d  d l m Z m Z Wn( e k
 rT d  d l m Z m Z Yn Xy d  d l m Z Wn% e k
 r Gd d   d  Z Yn Xd  d l m	 Z	 d d l
 m Z d d	 l m Z d d
 l 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   P/mod/web/acousticsspace/venv/lib/python3.5/site-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   )InvalidHeader)six)iterkeys
itervalues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__6   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)NlastF)_Nullr   r   getlenr   popitemr   )r   r"   valueevicted_value_keyr   r   r   __setitem__=   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__L   s    
	z!RecentlyUsedContainer.__delitem__c          	   C   s"   |  j   t |  j  SWd  QRXd  S)N)r   r(   r   )r   r   r   r   __len__S   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__W   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   r3   \   s    
	zRecentlyUsedContainer.clearc          
   C   s(   |  j   t t |  j   SWd  QRXd  S)N)r   r2   r   r   )r   r   r   r   keysf   s    
zRecentlyUsedContainer.keys)r   r   r   __doc__r   r   r    r$   r-   r.   r/   r1   r3   r5   r   r   r   r   r      s   
c                   sc  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 j r 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 e d d  Z e 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                sn   t  t |   j   t   |  _ | d  k	 rW t | t  rJ |  j |  n |  j |  | rj |  j |  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*   | | g |  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)Nr5   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>   )rB   rC   rD   r   r   r   rE      s    )r8   r   hasattrtypedict
itermerged)r   otherr   r   r   __eq__   s     zHTTPHeaderDict.__eq__c             C   s   |  j  |  S)N)rK   )r   rJ   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   r4   )r   valsr   r   r   r1      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)rN   )r   r"   r   r   r   discard   s    zHTTPHeaderDict.discardc             C   sJ   | j    } | | g } |  j j | |  } | | k	 rF | 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'
        N)r>   r   
setdefaultappend)r   r"   r?   	key_lowernew_valsrM   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   r5   N)r(   	TypeErrorformatr8   r   	iteritemsrV   r   rF   r5   items)r   argsr<   rJ   r"   r?   r*   r   r   r   r:      s$    "zHTTPHeaderDict.extendc             C   sU   y |  j  | j   } Wn) t k
 rB | |  j k r: g  S| SYn X| 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>   rN   rO   )r   r"   rP   rM   r   r   r   getlist  s    	zHTTPHeaderDict.getlistc             C   s#   d t  |   j t |  j    f S)Nz%s(%s))rG   r   rH   rI   )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)r\   r8   r2   r   r>   )r   rJ   r"   r?   r   r   r   r9     s
    zHTTPHeaderDict._copy_fromc             C   s    t  |     } | j |   | S)N)rG   r9   )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"   rM   r?   r   r   r   rY   '  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   rI   .  s    zHTTPHeaderDict.itermergedc             C   s   t  |  j    S)N)r2   rY   )r   r   r   r   rZ   4  s    zHTTPHeaderDict.itemsc             C   s   d } g  } x | j  D] } | j |  ru | sD t d |   n1 | d \ } } | | d | j   f | d <q | j d d  \ } } | j | | j   f  q W|  |  S)	z4Read headers from a Python 2 httplib message object. 	z/Header continuation with no previous header: %sr   :)r`   ra   rc   )r;   
startswithr   stripsplitrS   )clsmessageobs_fold_continued_leadersr;   liner"   r*   r   r   r   from_httplib7  s    zHTTPHeaderDict.from_httplib)%r   r   r   r6   r    r-   r$   r.   rA   rK   rL   r   PY2r   r   r   objectrO   r/   r1   r!   rQ   rV   r:   r\   
getheadersgetallmatchingheadersigetget_allr]   r9   r_   rY   rI   rZ   classmethodrk   r   r   )r=   r   r   k   s<    					N)
__future__r   collections.abcr   r   ImportErrorcollections	threadingr   r   
exceptionsr   packagesr   Zpackages.sixr   r   __all__rm   r&   r   r   r   r   r   r   <module>   s    	L