U
    ÎZjø$  ã                   @   s  d Z ddlmZm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 n8 e
k
r„   ddlmZ ddlmZ ddlm	Z	 Y nX zddlmZ ddlmZ W nN e
k
rð   zddlmZ ddlmZ W n e
k
rê   dZdZY nX Y nX ejd	k �rdZn4zdd
lmZ W n" e
k
�r6   dd
lmZ Y nX ejdk �rJdZn4zddlmZ W n" e
k
�r|   ddlmZ Y nX ejdkZe�r¨ddlZddlmZmZ n ddlZddlmZ ddl mZ ze!Z!W n e"k
�rî   e#e$fZ!Y nX G dd„ deƒZ%dZ&dS )zþPrivate 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
é    )ÚMappingÚMutableMappingN)Úfields)Úfilepost)Úpoolmanager)ÚHTTPConnection)Ú
connectioni  )Útimeouti  )Ú	appengine)é   r   )Ú	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 k	r<t|tƒr2|  |¡ n
|  |¡ |rJ|  |¡ d S ©N)Úsuperr   Ú__init__Ú
_containerÚ
isinstanceÚ
_copy_fromÚextend)ÚselfÚheadersÚkwargs©Ú	__class__© ú\/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/requests_toolbelt/_compat.pyr   g   s    

zHTTPHeaderDict.__init__c                 C   s    ||f| j | ¡ < | j | ¡  S r   ©r   Úlower©r   ÚkeyÚvalr   r   r   Ú__setitem__r   s    zHTTPHeaderDict.__setitem__c                 C   s    | j | ¡  }d |dd … ¡S )Nú, é   ©r   r   Újoinr   r   r   r   Ú__getitem__v   s    zHTTPHeaderDict.__getitem__c                 C   s   | j | ¡ = d S r   r   ©r   r    r   r   r   Ú__delitem__z   s    zHTTPHeaderDict.__delitem__c                 C   s   |  ¡ | jkS r   )r   r   r(   r   r   r   Ú__contains__}   s    zHTTPHeaderDict.__contains__c                 C   s^   t |tƒst|dƒsdS t |t| ƒƒs2t| ƒ|ƒ}tdd„ |  ¡ D ƒƒtdd„ | ¡ D ƒƒkS )NÚkeysFc                 s   s   | ]\}}|  ¡ |fV  qd S r   ©r   ©Ú.0ÚkÚvr   r   r   Ú	<genexpr>…   s     z(HTTPHeaderDict.__eq__.<locals>.<genexpr>c                 s   s   | ]\}}|  ¡ |fV  qd S r   r,   r-   r   r   r   r1   †   s     )r   r   ÚhasattrÚtypeÚdictÚ
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 k
r0   || jkr(‚ | Y S X | |= |S dS )z¢D.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 k
r   Y nX d S r   )r@   r(   r   r   r   Údiscard­   s    
zHTTPHeaderDict.discardc                 C   sX   |  ¡ }||f}| j ||¡}||k	rTt|tƒr<| |¡ n|d |d |g| j|< 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'
        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 ]}|  ||| ¡ q˜n|D ]\}}|  ||¡ q´| 
¡ D ]\}}|  ||¡ qÒd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$   z8extend() takes at most 1 positional arguments ({} given)r   r   r+   N)r:   Ú	TypeErrorÚformatr   r   Ú	iteritemsrK   r   r2   r+   Úitems)r   Úargsr   r7   r    r!   rC   r   r   r   r   Ê   s$    ÿ


zHTTPHeaderDict.extendc                 C   sP   z| j | ¡  }W n tk
r*   g  Y S X 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))r3   Ú__name__r4   r5   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   )r3   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ÚigetrT   r   rV   rN   r5   rO   Úclassmethodrb   Ú__classcell__r   r   r   r   r   E   s<   !r   )Ú
basestringr   r   r   r   r	   r   Úqueuer   Ú
gaecontribr   )'re   Úcollectionsr   r   Ú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.utilrq   Z!requests.packages.urllib3.contribr
   Zurllib3.contribÚversion_inforf   rp   Úurllib.parser   r   ÚQueueÚurllibÚurlparsero   Ú	NameErrorÚstrÚbytesr   Ú__all__r   r   r   r   Ú<module>   s^   

 f