o
    Ëý°jl,  ã                   @   sÜ   d dl mZ z
d dlmZmZ W n ey!   d dlmZmZ Y nw zd dlmZ W n ey:   G dd„ dƒZY nw d 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G dd„ deƒZG d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   ó   d S ©N© ©Úselfr   r   ú“/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/pip/_vendor/urllib3/_collections.pyÚ	__enter__   ó   zRLock.__enter__c                 C   r   r   r   )r
   Úexc_typeÚ	exc_valueÚ	tracebackr   r   r   Ú__exit__   r   zRLock.__exit__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s    r   )ÚOrderedDicté   )ÚInvalidHeader)Úsix)ÚiterkeysÚ
itervaluesÚRecentlyUsedContainerÚHTTPHeaderDictc                   @   sV   e Zd ZdZeZ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   s"   || _ || _|  ¡ | _tƒ | _d S r   )Ú_maxsizeÚdispose_funcÚContainerClsÚ
_containerr   Úlock)r
   Úmaxsizer   r   r   r   Ú__init__/   s   
zRecentlyUsedContainer.__init__c                 C   sD   | j � | j |¡}|| j|< |W  d   ƒ S 1 sw   Y  d S r   )r"   r!   Úpop)r
   ÚkeyÚitemr   r   r   Ú__getitem__6   s
   
$ýz!RecentlyUsedContainer.__getitem__c                 C   sˆ   t }| j�% | j |t ¡}|| j|< t| jƒ| jkr#| jjdd�\}}W d   ƒ n1 s-w   Y  | jr@|t urB|  |¡ d S d S d S )NF)Úlast)Ú_Nullr"   r!   ÚgetÚlenr   Úpopitemr   )r
   r&   ÚvalueÚevicted_valueÚ_keyr   r   r   Ú__setitem__=   s   
€ø
ÿz!RecentlyUsedContainer.__setitem__c                 C   sJ   | j � | j |¡}W d   ƒ n1 sw   Y  | jr#|  |¡ d S d S r   )r"   r!   r%   r   )r
   r&   r.   r   r   r   Ú__delitem__L   s   ÿÿz!RecentlyUsedContainer.__delitem__c                 C   s4   | j � t| jƒW  d   ƒ S 1 sw   Y  d S r   )r"   r,   r!   r	   r   r   r   Ú__len__S   s   $ÿzRecentlyUsedContainer.__len__c                 C   s   t dƒ‚)Nz7Iteration over this class is unlikely to be threadsafe.)ÚNotImplementedErrorr	   r   r   r   Ú__iter__W   s   ÿzRecentlyUsedContainer.__iter__c                 C   s`   | j � tt| jƒƒ}| j ¡  W d   ƒ n1 sw   Y  | jr,|D ]	}|  |¡ q$d S d S r   )r"   Úlistr   r!   Úclearr   )r
   Úvaluesr.   r   r   r   r7   \   s   ýþzRecentlyUsedContainer.clearc                 C   s8   | j � tt| jƒƒW  d   ƒ S 1 sw   Y  d S r   )r"   r6   r   r!   r	   r   r   r   Úkeysf   s   $ÿzRecentlyUsedContainer.keys)r   N)r   r   r   Ú__doc__r   r    r$   r(   r1   r2   r3   r5   r7   r9   r   r   r   r   r      s    

c                       sþ   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fdd„Zdd„ Zdd„ Zdd„ Zefdd„Z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%‡  Z&S )0r   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| ƒ ¡  tƒ | _|d urt|tƒr|  |¡ n|  |¡ |r(|  |¡ d S d S r   )Ú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 | ¡  S r   ©r!   Úlower©r
   r&   Úvalr   r   r   r1   ˜   s   zHTTPHeaderDict.__setitem__c                 C   s    | j | ¡  }d |dd … ¡S )Nú, r   ©r!   rD   ÚjoinrE   r   r   r   r(   œ   s   zHTTPHeaderDict.__getitem__c                 C   s   | j | ¡ = d S r   rC   ©r
   r&   r   r   r   r2       s   zHTTPHeaderDict.__delitem__c                 C   s   |  ¡ | jv S r   )rD   r!   rJ   r   r   r   Ú__contains__£   s   zHTTPHeaderDict.__contains__c                 C   s^   t |tƒst|dƒsdS t |t| ƒƒst| ƒ|ƒ}tdd„ |  ¡ D ƒƒtdd„ | ¡ D ƒƒkS )Nr9   Fc                 s   s    � | ]\}}|  ¡ |fV  qd S r   )rD   )Ú.0ÚkÚvr   r   r   Ú	<genexpr>«   s   € z(HTTPHeaderDict.__eq__.<locals>.<genexpr>)r<   r   ÚhasattrÚtypeÚdictÚ
itermerged©r
   Úotherr   r   r   Ú__eq__¦   s   
ÿzHTTPHeaderDict.__eq__c                 C   s   |   |¡ S r   )rV   rT   r   r   r   Ú__ne__¯   ó   zHTTPHeaderDict.__ne__c                 C   s
   t | jƒS r   )r,   r!   r	   r   r   r   r3   ¸   s   
zHTTPHeaderDict.__len__c                 c   s    � | j  ¡ D ]}|d V  qd S )Nr   )r!   r8   )r
   Úvalsr   r   r   r5   »   s   €ÿzHTTPHeaderDict.__iter__c                 C   s:   z| | }W n t y   || ju r‚ | Y S w | |= |S )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.
        )ÚKeyErrorÚ_HTTPHeaderDict__marker)r
   r&   Údefaultr.   r   r   r   r%   À   s   
ýzHTTPHeaderDict.popc                 C   s"   z| |= W d S  t y   Y d S w r   )rZ   rJ   r   r   r   ÚdiscardÑ   s
   ÿzHTTPHeaderDict.discardc                 C   s8   |  ¡ }||g}| j ||¡}||ur| |¡ dS dS )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)rD   r!   Ú
setdefaultÚappend)r
   r&   rF   Ú	key_lowerÚnew_valsrY   r   r   r   Úadd×   s   	ÿzHTTPHeaderDict.addc                 O   sì   t |ƒdkrtd t |ƒ¡ƒ‚t |ƒdkr|d nd}t|tƒr0| ¡ D ]
\}}|  ||¡ q$n5t|tƒrC|D ]
}|  ||| ¡ q7n"t|dƒrX| 	¡ D ]
}|  ||| ¡ qLn|D ]
\}}|  ||¡ qZ| 
¡ D ]
\}}|  ||¡ qidS )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__
        r   z9extend() takes at most 1 positional arguments ({0} given)r   r   r9   N)r,   Ú	TypeErrorÚformatr<   r   Ú	iteritemsrb   r   rP   r9   Úitems)r
   Úargsr@   rU   r&   rF   r.   r   r   r   r>   ç   s.   
þ
ÿ
ÿ
ÿÿzHTTPHeaderDict.extendc                 C   sH   z	| j | ¡  }W n ty   || ju rg  Y S | Y S w |dd… 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!   rD   rZ   r[   )r
   r&   r\   rY   r   r   r   Úgetlist  s   
ýzHTTPHeaderDict.getlistc                 C   s    g d¢}|D ]}|   |¡ q| S )z–
        Remove content-specific header fields before changing the request
        method to GET or HEAD according to RFC 9110, Section 15.4.
        )zContent-EncodingzContent-LanguagezContent-LocationzContent-TypezContent-LengthÚDigestzLast-Modified)r]   )r
   Úcontent_specific_headersÚheaderr   r   r   Ú_prepare_for_method_change  s   	z)HTTPHeaderDict._prepare_for_method_changec                 C   s   dt | ƒjt|  ¡ ƒf S )Nz%s(%s))rQ   r   rR   rS   r	   r   r   r   Ú__repr__)  s   zHTTPHeaderDict.__repr__c                 C   s>   |D ]}|  |¡}t|tƒrt|ƒ}|g| | j| ¡ < qd S r   )rh   r<   r6   r!   rD   )r
   rU   r&   rF   r   r   r   r=   ,  s   

ûzHTTPHeaderDict._copy_fromc                 C   s   t | ƒƒ }| | ¡ |S r   )rQ   r=   )r
   Úcloner   r   r   Úcopy4  s   

zHTTPHeaderDict.copyc                 c   s>   � | D ]}| j | ¡  }|dd… D ]	}|d |fV  qqdS )z8Iterate over all header lines, including duplicate ones.r   Nr   rC   )r
   r&   rY   rF   r   r   r   re   9  s   €ÿþzHTTPHeaderDict.iteritemsc                 c   s:   � | D ]}| j | ¡  }|d d |dd… ¡fV  qdS )z:Iterate over all headers, merging duplicate ones together.r   rG   r   NrH   rE   r   r   r   rS   @  s
   €þzHTTPHeaderDict.itermergedc                 C   s   t |  ¡ ƒS r   )r6   re   r	   r   r   r   rf   F  rX   zHTTPHeaderDict.itemsc                 C   s~   d}g }|j D ]3}| |¡r)|std| ƒ‚|d \}}||d | ¡  f|d< q| dd¡\}}| || ¡ f¡ q| |ƒS )z4Read headers from a Python 2 httplib message object.)ú ú	z/Header continuation with no previous header: %séÿÿÿÿrp   ú:r   )r?   Ú
startswithr   ÚstripÚsplitr_   )ÚclsÚmessageÚobs_fold_continued_leadersr?   Úliner&   r.   r   r   r   Úfrom_httplibI  s   

ÿzHTTPHeaderDict.from_httplibr   )'r   r   r   r:   r$   r1   r(   r2   rK   rV   rW   r   ÚPY2r   r   r   Úobjectr[   r3   r5   r%   r]   rb   r>   rh   rl   Ú
getheadersÚgetallmatchingheadersÚigetÚget_allrm   r=   ro   re   rS   rf   Úclassmethodr{   Ú__classcell__r   r   rA   r   r   k   sB    !	N)Ú
__future__r   Úcollections.abcr   r   ÚImportErrorÚcollectionsÚ	threadingr   r   Ú
exceptionsr   Úpackagesr   Úpackages.sixr   r   Ú__all__r}   r*   r   r   r   r   r   r   Ú<module>   s&    ÿþ
L