a
    !f(%                     @   s
  d Z ddlZddlZz(ddlmZ ddlmZ ddlmZ W n6 eyr   ddlmZ ddlmZ ddlmZ Y n0 zddl	m
Z
 ddlmZ W nJ ey   zddlm
Z
 ddlmZ W n ey   dZ
dZY n0 Y n0 ejdk rdZn2zdd	lmZ W n  ey   dd	lmZ Y n0 ejd
k r0dZn2zddlmZ W n  ey`   ddlmZ Y n0 ejdkZerddlmZmZ ddlZddlmZmZ n0ddlmZmZ ddlZddl mZ ddl!mZ ze"Z"W n e#y   e$e%fZ"Y n0 G dd deZ&dZ'dS )zPrivate module full of compatibility hacks.

Primarily this is for downstream redistributions of requests that unvendor
urllib3 without providing a shim.

.. warning::

    This module is private. If you use it, and something breaks, you were
    warned
    N)fields)filepost)poolmanager)HTTPConnection)
connectioni  )timeouti  )	appengine)   r   )MappingMutableMapping)	urlencodeurljoin)r   )r   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sZe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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"  Z#S ).HTTPHeaderDictap  
    :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|   i | _|d ur<t|tr2| | n
| | |rJ| | d S N)superr   __init__
_container
isinstance
_copy_fromextend)selfheaderskwargs	__class__ Z/var/www/html/python-backend/venv/lib/python3.9/site-packages/requests_toolbelt/_compat.pyr   h   s    

zHTTPHeaderDict.__init__c                 C   s    ||f| j | < | j |  S r   r   lowerr   keyvalr   r   r   __setitem__s   s    zHTTPHeaderDict.__setitem__c                 C   s    | j |  }d|dd  S )N,    r   r   joinr   r   r   r   __getitem__w   s    zHTTPHeaderDict.__getitem__c                 C   s   | j | = d S r   r   r   r    r   r   r   __delitem__{   s    zHTTPHeaderDict.__delitem__c                 C   s   |  | jv S r   )r   r   r(   r   r   r   __contains__~   s    zHTTPHeaderDict.__contains__c                 C   sV   t |tst|dsdS t |t| s2t| |}dd |  D dd | D kS )NkeysFc                 S   s   i | ]\}}|  |qS r   r   .0kvr   r   r   
<dictcomp>       z)HTTPHeaderDict.__eq__.<locals>.<dictcomp>c                 S   s   i | ]\}}|  |qS r   r,   r-   r   r   r   r1      r2   )r   r
   hasattrtype
itermergedr   otherr   r   r   __eq__   s    zHTTPHeaderDict.__eq__c                 C   s   |  | S r   )r8   r6   r   r   r   __ne__   s    zHTTPHeaderDict.__ne__c                 C   s
   t | jS r   )lenr   r   r   r   r   __len__   s    zHTTPHeaderDict.__len__c                 c   s   | j  D ]}|d V  q
d S )Nr   )r   values)r   valsr   r   r   __iter__   s    zHTTPHeaderDict.__iter__c                 C   s>   z| | }W n" t y.   || ju r& | Y S 0 | |= |S dS )zD.pop(k[,d]) -> v, remove specified key and return its value.

        If key is not found, d is returned if given, otherwise KeyError is
        raised.
        N)KeyError_HTTPHeaderDict__marker)r   r    defaultvaluer   r   r   pop   s    


zHTTPHeaderDict.popc                 C   s"   z
| |= W n t y   Y n0 d S r   )r@   r(   r   r   r   discard   s    
zHTTPHeaderDict.discardc                 C   sX   |  }||f}| j||}||urTt|tr<|| n|d |d |g| 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'
        r   r$   N)r   r   
setdefaultr   listappend)r   r    r!   	key_lowernew_valsr>   r   r   r   add   s    	
zHTTPHeaderDict.addc                 O   s   t |dkrtdt |t |dkr2|d nd}t|tr`| D ]\}}| || qHnjt|tr|D ]}| |||  qnnDt|dr|	 D ]}| |||  qn|D ]\}}| || q|
 D ]\}}| || qd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$   z8extend() takes at most 1 positional arguments ({} given)r   r   r+   N)r:   	TypeErrorformatr   r   	iteritemsrK   r
   r3   r+   items)r   argsr   r7   r    r!   rC   r   r   r   r      s$    


zHTTPHeaderDict.extendc                 C   sN   z| j |  }W n ty(   g  Y S 0 t|tr>|d gS |dd S 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   r   r@   r   tuple)r   r    r>   r   r   r   getlist   s    


zHTTPHeaderDict.getlistc                 C   s   dt | jt|  f S )Nz%s(%s))r4   __name__dictr5   r;   r   r   r   __repr__   s    zHTTPHeaderDict.__repr__c                 C   s>   |D ]4}| |}t|tr$t|}|g| | j| < qd S r   )rR   r   rG   r   r   )r   r7   r    r!   r   r   r   r      s
    

zHTTPHeaderDict._copy_fromc                 C   s   t |  }||  |S r   )r4   r   )r   cloner   r   r   copy  s    

zHTTPHeaderDict.copyc                 c   s<   | D ]2}| j |  }|dd D ]}|d |fV  q"qdS )z8Iterate over all header lines, including duplicate ones.r$   Nr   r   )r   r    r>   r!   r   r   r   rN     s    zHTTPHeaderDict.iteritemsc                 c   s8   | D ].}| j |  }|d d|dd fV  qdS )z:Iterate over all headers, merging duplicate ones together.r   r#   r$   Nr%   r   r   r   r   r5     s    zHTTPHeaderDict.itermergedc                 C   s   t |  S r   )rG   rN   r;   r   r   r   rO     s    zHTTPHeaderDict.itemsc                 C   sj   g }|j D ]V}|dr>|d \}}||d |  f|d< q
|dd\}}||| f q
| |S )z4Read headers from a Python 2 httplib message object.) 	z
:r$   )r   
startswithrstripsplitrH   strip)clsmessager   liner    rC   r   r   r   from_httplib  s    

zHTTPHeaderDict.from_httplib)N)$rS   
__module____qualname____doc__r   r"   r'   r)   r*   r8   r9   PY3r   iterkeys
itervaluesobjectrA   r<   r?   rD   rE   rK   r   rR   
getheadersgetallmatchingheadersigetrU   r   rW   rN   r5   rO   classmethodrc   __classcell__r   r   r   r   r   F   s<   !r   )
basestringr   r   r   r   r   r   queuer   
gaecontribr   )(rf   sysrequestsZrequests.packages.urllib3r   r   r   ImportErrorurllib3Z$requests.packages.urllib3.connectionr   r   Zurllib3.connection	__build__r   Zrequests.packages.urllib3.utilZurllib3.utilrr   Z!requests.packages.urllib3.contribr   Zurllib3.contribversion_inforg   collections.abcr
   r   rq   urllib.parser   r   collectionsQueueurlliburlparserp   	NameErrorstrbytesr   __all__r   r   r   r   <module>   s`   


 f