
    /h;*                        d dl mZ 	 d dlmZmZ n# e$ r d dlmZmZ Y nw xY w	 d dlmZ n# e$ r  G d d          ZY nw xY 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e          Z G d de          ZdS )    )absolute_import)MappingMutableMapping)RLockc                       e Zd Zd Zd ZdS )r   c                     d S N selfs    S/var/www/html/venv/lib/python3.11/site-packages/pip/_vendor/urllib3/_collections.py	__enter__zRLock.__enter__       D    c                     d S r	   r
   )r   exc_type	exc_value	tracebacks       r   __exit__zRLock.__exit__   r   r   N)__name__
__module____qualname__r   r   r
   r   r   r   r      s2        	 	 		 	 	 	 	r   r   )OrderedDict   )InvalidHeader)six)iterkeys
itervaluesRecentlyUsedContainerHTTPHeaderDictc                   H    e Zd ZdZeZddZd Zd Zd Z	d Z
d	 Zd
 Z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                 z    || _         || _        |                                 | _        t	                      | _        d S r	   )_maxsizedispose_funcContainerCls
_containerr   lock)r   maxsizer%   s      r   __init__zRecentlyUsedContainer.__init__/   s3    (++--GG			r   c                     | j         5  | j                            |          }|| j        |<   |cd d d            S # 1 swxY w Y   d S r	   )r(   r'   pop)r   keyitems      r   __getitem__z!RecentlyUsedContainer.__getitem__6   s    Y 	 	?&&s++D#'DOC 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   &;??c                 n   t           }| j        5  | j                            |t                     }|| j        |<   t	          | j                  | j        k    r| j                            d          \  }}d d d            n# 1 swxY w Y   | j        r |t           ur|                     |           d S d S d S )NF)last)_Nullr(   r'   getlenr$   popitemr%   )r   r-   valueevicted_value_keys        r   __setitem__z!RecentlyUsedContainer.__setitem__=   s   Y 	J 	J O//U;;M#(DOC  4?##dm33&*o&=&=5&=&I&I#m	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J  	-e!;!;m,,,,,	- 	-!;!;s   A&BBBc                     | j         5  | j                            |          }d d d            n# 1 swxY w Y   | j        r|                     |           d S d S r	   )r(   r'   r,   r%   )r   r-   r6   s      r   __delitem__z!RecentlyUsedContainer.__delitem__L   s    Y 	- 	-O'',,E	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-  	%e$$$$$	% 	%s   /33c                 l    | j         5  t          | j                  cd d d            S # 1 swxY w Y   d S r	   )r(   r4   r'   r   s    r   __len__zRecentlyUsedContainer.__len__S   s{    Y 	( 	(t''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   )--c                      t          d          )Nz7Iteration over this class is unlikely to be threadsafe.)NotImplementedErrorr   s    r   __iter__zRecentlyUsedContainer.__iter__W   s    !E
 
 	
r   c                     | j         5  t          t          | j                            }| j                                         d d d            n# 1 swxY w Y   | j        r|D ]}|                     |           d S d S r	   )r(   listr   r'   clearr%   )r   valuesr6   s      r   rC   zRecentlyUsedContainer.clear\   s    Y 	$ 	$*T_5566FO!!###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$
  	) ) )!!%((((	) 	)) )s   ;AAAc                     | j         5  t          t          | j                            cd d d            S # 1 swxY w Y   d S r	   )r(   rB   r   r'   r   s    r   keyszRecentlyUsedContainer.keysf   s    Y 	3 	31122	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s   !6::)r"   N)r   r   r   __doc__r   r&   r*   r/   r9   r;   r=   r@   rC   rF   r
   r   r   r   r      s          L     - - -% % %( ( (
 
 

) ) )3 3 3 3 3r   c                       e Zd ZdZd fd	Zd Zd Zd Zd Zd Z	d	 Z
ej        rej        Zej        Z e            Zd
 Zd ZefdZd Zd Zd ZefdZeZeZeZeZd Zd Zd Zd Z d Z!d Z"e#d             Z$ x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                 2   t          t          |                                            t                      | _        |@t          |t                    r|                     |           n|                     |           |r|                     |           d S d S r	   )superr    r*   r   r'   
isinstance
_copy_fromextend)r   headerskwargs	__class__s      r   r*   zHTTPHeaderDict.__init__   s    nd##,,...%--'>22 %((((G$$$ 	 KK	  	 r   c                 |    ||g| j         |                                <   | j         |                                         S r	   r'   lowerr   r-   vals      r   r9   zHTTPHeaderDict.__setitem__   s/    (+Sz		$syy{{++r   c                 z    | j         |                                         }d                    |dd                    S )N, r   r'   rS   joinrT   s      r   r/   zHTTPHeaderDict.__getitem__   s0    ociikk*yyQRR!!!r   c                 :    | j         |                                = d S r	   rR   r   r-   s     r   r;   zHTTPHeaderDict.__delitem__   s    OCIIKK(((r   c                 8    |                                 | j        v S r	   )rS   r'   r[   s     r   __contains__zHTTPHeaderDict.__contains__   s    yy{{do--r   c                 j   t          |t                    st          |d          sdS t          |t          |                     s t          |           |          }t	          d |                                 D                       t	          d |                                D                       k    S )NrF   Fc              3   H   K   | ]\  }}|                                 |fV  d S r	   rS   .0kvs      r   	<genexpr>z(HTTPHeaderDict.__eq__.<locals>.<genexpr>   s2      AAtq!QWWYYNAAAAAAr   c              3   H   K   | ]\  }}|                                 |fV  d S r	   r`   ra   s      r   re   z(HTTPHeaderDict.__eq__.<locals>.<genexpr>   sK       J
 J
#q!QWWYYNJ
 J
 J
 J
 J
 J
r   )rK   r   hasattrtypedict
itermergedr   others     r   __eq__zHTTPHeaderDict.__eq__   s    %)) 	'%2H2H 	5%d,, 	&DJJu%%EAAt/@/@AAAAAT J
 J
','7'7'9'9J
 J
 J
 F
 F
 
 	
r   c                 .    |                      |           S r	   )rm   rk   s     r   __ne__zHTTPHeaderDict.__ne__   s    ;;u%%%%r   c                 *    t          | j                  S r	   )r4   r'   r   s    r   r=   zHTTPHeaderDict.__len__   s    4?###r   c              #   V   K   | j                                         D ]}|d         V  d S )Nr   )r'   rD   )r   valss     r   r@   zHTTPHeaderDict.__iter__   s<      O**,, 	 	Dq'MMMM	 	r   c                 V    	 | |         }| |= |S # t           $ r || j        u r |cY S w xY w)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.
        )KeyError_HTTPHeaderDict__marker)r   r-   defaultr6   s       r   r,   zHTTPHeaderDict.pop   sT    	IE S	L  	 	 	$-''NNN	s    ((c                 0    	 | |= d S # t           $ r Y d S w xY wr	   )rt   r[   s     r   discardzHTTPHeaderDict.discard   s4    	S			 	 	 	DD	s    
c                     |                                 }||g}| j                            ||          }||ur|                    |           dS 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)rS   r'   
setdefaultappend)r   r-   rU   	key_lowernew_valsrr   s         r   addzHTTPHeaderDict.add   s\     IIKK	:)))X>>4KK  r   c                    t          |          dk    r/t          d                    t          |                              t          |          dk    r|d         nd}t          |t                    r1|                                D ]\  }}|                     ||           nt          |t                    r"|D ]}|                     |||                    nbt          |d          r4|	                                D ]}|                     |||                    n|D ]\  }}|                     ||           |
                                D ]\  }}|                     ||           d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   r
   rF   N)r4   	TypeErrorformatrK   r    	iteritemsr~   r   rg   rF   items)r   argsrO   rl   r-   rU   r6   s          r   rM   zHTTPHeaderDict.extend   s   
 t99q==((.s4yy(9(9   t99>>Qre^,, 	%!OO-- # #Sc""""#w'' 	% * *eCj))))*UF## 	%zz|| * *eCj))))* $ % %
Ue$$$$ ,,.. 	! 	!JCHHS%    	! 	!r   c                     	 | j         |                                         }|dd         S # t          $ r || j        u rg cY S |cY S w xY w)zmReturns a list of all the values for the named field. Returns an
        empty list if the key doesn't exist.r   N)r'   rS   rt   ru   )r   r-   rv   rr   s       r   getlistzHTTPHeaderDict.getlist  sf    	?399;;/D 8O  	 	 	$-''			NNN	s   + AAAc                 t    t          |           j        dt          |                                           dS )N())rh   r   ri   rj   r   s    r   __repr__zHTTPHeaderDict.__repr__  s4    ::...T__5F5F0G0G0G0GHHr   c                     |D ][}|                     |          }t          |t                    rt          |          }|g|z   | j        |                                <   \d S r	   )r   rK   rB   r'   rS   )r   rl   r-   rU   s       r   rL   zHTTPHeaderDict._copy_from  sf     	7 	7C--$$C#t$$  3ii,/53;DOCIIKK((	7 	7r   c                 ^     t          |                       }|                    |            |S r	   )rh   rL   )r   clones     r   copyzHTTPHeaderDict.copy"  s,    T

r   c              #      K   | D ]:}| j         |                                         }|dd         D ]}|d         |fV  ;dS )z8Iterate over all header lines, including duplicate ones.r   Nr   rR   )r   r-   rr   rU   s       r   r   zHTTPHeaderDict.iteritems'  sf       	# 	#C?399;;/DABBx # #1gsl""""#	# 	#r   c              #      K   | D ]H}| j         |                                         }|d         d                    |dd                   fV  IdS )z:Iterate over all headers, merging duplicate ones together.r   rW   r   NrX   rT   s      r   rj   zHTTPHeaderDict.itermerged.  s_       	- 	-C/#))++.Ca&$))CG,,,,,,,	- 	-r   c                 D    t          |                                           S r	   )rB   r   r   s    r   r   zHTTPHeaderDict.items4  s    DNN$$%%%r   c                 `   d}g }|j         D ]}|                    |          r?|st          d|z            |d         \  }}||dz   |                                z   f|d<   V|                    dd          \  }}|                    ||                                f            | |          S )z4Read headers from a Python 2 httplib message object.) 	z/Header continuation with no previous header: %sr   :r   )rN   
startswithr   stripsplitr{   )clsmessageobs_fold_continued_leadersrN   liner-   r6   s          r   from_httplibzHTTPHeaderDict.from_httplib7  s     &1"O 	1 	1D9::  
 (IDP   ")JC#&djjll(B"CGBKC++JCNNC/0000s7||r   r	   )&r   r   r   rG   r*   r9   r/   r;   r]   rm   ro   r   PY2r   r   r   objectru   r=   r@   r,   rx   r~   rM   r   
getheadersgetallmatchingheadersigetget_allr   rL   r   r   rj   r   classmethodr   __classcell__)rP   s   @r   r    r    k   s        B	  	  	  	  	  	 , , ," " ") ) ). . .
 
 
& & & w /!*#.
vxxH$ $ $  
  (    "     ! ! !8 $, 
 
 
 
 J#D GI I I7 7 7  
# # #- - -& & &   [    r   N)
__future__r   collections.abcr   r   ImportErrorcollections	threadingr   r   
exceptionsr   packagesr   packages.sixr   r   __all__r   r2   r   r    r
   r   r   <module>r      s   & & & & & &4777777777 4 4 433333333334	             $ # # # # # % % % % % %       . . . . . . . ."$4
5 	I3 I3 I3 I3 I3N I3 I3 I3Xf f f f f^ f f f f fs    !!, A A