U ��.e(*�@s�ddlmZzddlmZmZWn$ek rDddlmZmZYnXzddlmZWn"ek rxGdd�d�ZYnXddlm Z ddl m Z dd l m Z mZmZd d gZe�ZGd d �d e�ZGd d �d e�ZdS)�)�absolute_import)�Mapping�MutableMapping)�RLockc@seZdZdd�Zdd�ZdS)rcCsdS�N���selfrr�D/usr/lib/python3.8/site-packages/pip/_vendor/urllib3/_collections.py� __enter__ szRLock.__enter__cCsdSrr)r �exc_type� exc_value� tracebackrrr �__exit__szRLock.__exit__N)�__name__� __module__� __qualname__r rrrrr r sr)� OrderedDict�)� InvalidHeader)�iterkeys� itervalues�PY3�RecentlyUsedContainer�HTTPHeaderDictc@sVeZdZdZeZddd�Zdd�Zdd �Zd d �Z d d �Z dd�Z dd�Z dd�Z dS)ra� 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 � NcCs"||_||_|��|_t�|_dSr)�_maxsize� dispose_func� ContainerCls� _containerr�lock)r �maxsizerrrr �__init__.s zRecentlyUsedContainer.__init__c Cs8|j�(|j�|�}||j|<|W5QR�SQRXdSr)r r�pop)r �key�itemrrr � __getitem__5s  z!RecentlyUsedContainer.__getitem__c Cslt}|j�@|j�|t�}||j|<t|j�|jkrF|jjdd�\}}W5QRX|jrh|tk rh|�|�dS)NF)Zlast)�_Nullr r�get�lenr�popitemr)r r$�valueZ evicted_valueZ_keyrrr � __setitem__<s z!RecentlyUsedContainer.__setitem__c Cs2|j�|j�|�}W5QRX|jr.|�|�dSr)r rr#r)r r$r+rrr � __delitem__Ksz!RecentlyUsedContainer.__delitem__c Cs(|j�t|j�W5QR�SQRXdSr)r r)rrrrr �__len__RszRecentlyUsedContainer.__len__cCs td��dS)Nz7Iteration over this class is unlikely to be threadsafe.)�NotImplementedErrorrrrr �__iter__Vs�zRecentlyUsedContainer.__iter__c CsH|j�tt|j��}|j��W5QRX|jrD|D]}|�|�q4dSr)r �listrr�clearr)r �valuesr+rrr r2[s zRecentlyUsedContainer.clearc Cs,|j�tt|j��W5QR�SQRXdSr)r r1rrrrrr �keyseszRecentlyUsedContainer.keys)rN)rrr�__doc__rrr"r&r,r-r.r0r2r4rrrr rs   cs�eZdZdZd-�fdd� Zdd�Zdd�Zd d �Zd d �Zd d�Z dd�Z e sZe j Z e jZe�Zdd�Zdd�Zefdd�Zdd�Zdd�Zdd�Zefdd�ZeZeZeZeZdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Z d)d*�Z!e"d+d,��Z#�Z$S).rap :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 sPtt|���t�|_|dk r>t|t�r4|�|�n |�|�|rL|�|�dSr)�superrr"rr� isinstance� _copy_from�extend)r �headers�kwargs�� __class__rr r"�s   zHTTPHeaderDict.__init__cCs ||g|j|��<|j|��Sr�r�lower�r r$�valrrr r,�szHTTPHeaderDict.__setitem__cCs |j|��}d�|dd��S)N�, r�rr?�joinr@rrr r&�szHTTPHeaderDict.__getitem__cCs|j|��=dSrr>�r r$rrr r-�szHTTPHeaderDict.__delitem__cCs|��|jkSr)r?rrErrr � __contains__�szHTTPHeaderDict.__contains__cCs^t|t�st|d�sdSt|t|��s2t|�|�}tdd�|��D��tdd�|��D��kS)Nr4Fcss|]\}}|��|fVqdSr)r?)�.0�k�vrrr � �sz(HTTPHeaderDict.__eq__..)r7r�hasattr�type�dict� itermerged�r �otherrrr �__eq__�s �zHTTPHeaderDict.__eq__cCs |�|� Sr)rQrOrrr �__ne__�szHTTPHeaderDict.__ne__cCs t|j�Sr)r)rrrrr r.�szHTTPHeaderDict.__len__ccs|j��D]}|dVq dS)Nr)rr3)r �valsrrr r0�szHTTPHeaderDict.__iter__cCs@z ||}Wn$tk r0||jkr(�|YSX||=|SdS)z�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)�KeyError�_HTTPHeaderDict__marker)r r$�defaultr+rrr r#�s   zHTTPHeaderDict.popcCs$z ||=Wntk rYnXdSr)rTrErrr �discard�s zHTTPHeaderDict.discardcCs4|��}||g}|j�||�}||k r0|�|�dS)z�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' N)r?r� setdefault�append)r r$rAZ key_lowerZnew_valsrSrrr �add�s zHTTPHeaderDict.addcOs�t|�dkrtd�t|����t|�dkr2|dnd}t|t�r`|��D]\}}|�||�qHnjt|t�r�|D]}|�|||�qnnDt|d�r�|� �D]}|�|||�q�n|D]\}}|�||�q�|� �D]\}}|�||�q�dS)z�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__ rz9extend() takes at most 1 positional arguments ({0} given)rrr4N) r)� TypeError�formatr7r� iteritemsrZrrKr4�items)r �argsr;rPr$rAr+rrr r9�s( ��     zHTTPHeaderDict.extendcCsNz|j|��}Wn*tk r<||jkr4gYS|YSX|dd�SdS)zmReturns a list of all the values for the named field. Returns an empty list if the key doesn't exist.rN)rr?rTrU)r r$rVrSrrr �getlists  zHTTPHeaderDict.getlistcCsdt|�jt|���fS)Nz%s(%s))rLrrMrNrrrr �__repr__szHTTPHeaderDict.__repr__cCs>|D]4}|�|�}t|t�r$t|�}|g||j|��<qdSr)r`r7r1rr?)r rPr$rArrr r8s   zHTTPHeaderDict._copy_fromcCst|��}|�|�|Sr)rLr8)r Zclonerrr �copy!s  zHTTPHeaderDict.copyccs<|D]2}|j|��}|dd�D]}|d|fVq"qdS)z8Iterate over all header lines, including duplicate ones.rNrr>)r r$rSrArrr r]&szHTTPHeaderDict.iteritemsccs8|D].}|j|��}|dd�|dd��fVqdS)z:Iterate over all headers, merging duplicate ones together.rrBrNrCr@rrr rN-szHTTPHeaderDict.itermergedcCs t|���Sr)r1r]rrrr r^3szHTTPHeaderDict.itemscCs�d}g}|jD]h}|�|�rT|s.td|��n&|d\}}||d|��f|d<q|�dd�\}}|�||��f�q||�S)z4Read headers from a Python 2 httplib message object.)� � z/Header continuation with no previous header: %s�����rc�:r)r:� startswithr�strip�splitrY)�cls�messageZobs_fold_continued_leadersr:�liner$r+rrr � from_httplib6s  � zHTTPHeaderDict.from_httplib)N)%rrrr5r"r,r&r-rFrQrRrrrr�objectrUr.r0r#rWrZr9r`Z getheadersZgetallmatchingheadersZigetZget_allrar8rbr]rNr^� classmethodrm� __classcell__rrr<r rjs>!    N)Z __future__rZcollections.abcrr� ImportError� collectionsZ threadingrr� exceptionsrZ packages.sixrrr�__all__rnr'rrrrrr �s   L