
ÇË€Xø$  ã            9   @   s~  d  Z  d d l m Z m Z d d l Z d d l Z y4 d d l m Z d d l m Z d d l m	 Z	 WnB e
 k
 r¬ d d l m Z d d l m Z d d l m	 Z	 Yn Xy$ d d l m Z d d l m Z WnW e
 k
 r*y$ d d l m Z d d l m Z Wn e
 k
 r%d Z d Z Yn XYn Xe j d	 k  rCd Z n9 y d d
 l m Z Wn" e
 k
 r{d d
 l m Z Yn Xe j d k  r”d Z n9 y d d l m Z Wn" e
 k
 rÌd d l m Z Yn Xe 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 y
 e! Z! Wn e" k
 r]e# e$ f Z! Yn XGd 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é   )Ú	urlencodeÚurljoin)r   )r   c                   sW  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 s‡ e j Z e j Z e ƒ  Z d d „  Z d d „  Z e 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" ‡  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                sk   t  t |  ƒ j ƒ  i  |  _ | d  k	 rT t | t ƒ rG |  j | ƒ n |  j | ƒ | rg |  j | ƒ d  S)N)Úsuperr   Ú__init__Ú
_containerÚ
isinstanceÚ
_copy_fromÚextend)ÚselfÚheadersÚkwargs)Ú	__class__© ú;/usr/lib/python3/dist-packages/requests_toolbelt/_compat.pyr   g   s    	zHTTPHeaderDict.__init__c             C   s*   | | f |  j  | j ƒ  <|  j  | j ƒ  S)N)r   Úlower)r   ÚkeyÚvalr   r   r   Ú__setitem__r   s    zHTTPHeaderDict.__setitem__c             C   s*   |  j  | j ƒ  } d j | d d  … ƒ S)Nz, é   )r   r   Újoin)r   r   r   r   r   r   Ú__getitem__v   s    zHTTPHeaderDict.__getitem__c             C   s   |  j  | j ƒ  =d  S)N)r   r   )r   r   r   r   r   Ú__delitem__z   s    zHTTPHeaderDict.__delitem__c             C   s   | j  ƒ  |  j k S)N)r   r   )r   r   r   r   r   Ú__contains__}   s    zHTTPHeaderDict.__contains__c             C   s‡   t  | t ƒ r$ t | d ƒ r$ d St  | t |  ƒ ƒ sK t |  ƒ | ƒ } t d d „  |  j ƒ  Dƒ ƒ t d d „  | j ƒ  Dƒ ƒ k S)NÚkeysFc             s   s'   |  ] \ } } | j  ƒ  | f Vq d  S)N)r   )Ú.0ÚkÚvr   r   r   ú	<genexpr>…   s    z(HTTPHeaderDict.__eq__.<locals>.<genexpr>c             s   s'   |  ] \ } } | j  ƒ  | f Vq d  S)N)r   )r%   r&   r'   r   r   r   r(   †   s    )r   r   ÚhasattrÚtypeÚdictÚ
itermerged)r   Úotherr   r   r   Ú__eq__€   s     zHTTPHeaderDict.__eq__c             C   s   |  j  | ƒ S)N)r.   )r   r-   r   r   r   Ú__ne__ˆ   s    zHTTPHeaderDict.__ne__c             C   s   t  |  j ƒ S)N)Úlenr   )r   r   r   r   Ú__len__‘   s    zHTTPHeaderDict.__len__c             c   s'   x  |  j  j ƒ  D] } | d Vq Wd  S)Nr   )r   Úvalues)r   Úvalsr   r   r   Ú__iter__”   s    zHTTPHeaderDict.__iter__c             C   sH   y |  | } Wn( t  k
 r8 | |  j k r0 ‚  | SYn X|  | =| Sd 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$   y |  | =Wn t  k
 r Yn Xd  S)N)r5   )r   r   r   r   r   Údiscard­   s    zHTTPHeaderDict.discardc             C   sz   | j  ƒ  } | | f } |  j j | | ƒ } | | k	 rv t | t ƒ rX | j | ƒ 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   Z	key_lowerZnew_valsr3   r   r   r   Úadd³   s    	zHTTPHeaderDict.addc             O   sZ  t  | ƒ d k r- t d j t  | ƒ ƒ ƒ ‚ t  | ƒ d k rI | d n f  } t | t ƒ rŽ xÈ | j ƒ  D] \ } } |  j | | ƒ qk Wn› t | t ƒ rÅ x‰ | D] } |  j | | | ƒ q¤ Wnd t | d ƒ rxR | j	 ƒ  D] } |  j | | | ƒ qá Wn' x$ | D] \ } } |  j | | ƒ q	Wx* | j
 ƒ  D] \ } } |  j | | ƒ q6Wd 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$   N)r0   Ú	TypeErrorÚformatr   r   Ú	iteritemsr>   r   r)   r$   Úitems)r   Úargsr   r-   r   r   r8   r   r   r   r   Ê   s"    	"zHTTPHeaderDict.extendc             C   s\   y |  j  | j ƒ  } Wn t k
 r/ g  SYn) Xt | t ƒ rJ | d g S| d d … Sd 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   r5   r   Útuple)r   r   r3   r   r   r   Úgetlistä   s    	zHTTPHeaderDict.getlistc             C   s#   d t  |  ƒ j t |  j ƒ  ƒ f S)Nz%s(%s))r*   Ú__name__r+   r,   )r   r   r   r   Ú__repr__ö   s    zHTTPHeaderDict.__repr__c             C   sY   xR | D]J } | j  | ƒ } t | t ƒ r7 t | ƒ } | g | |  j | j ƒ  <q Wd  S)N)rE   r   r<   r   r   )r   r-   r   r   r   r   r   r   ù   s
    zHTTPHeaderDict._copy_fromc             C   s    t  |  ƒ ƒ  } | j |  ƒ | S)N)r*   r   )r   Zcloner   r   r   Úcopy  s    zHTTPHeaderDict.copyc             c   sR   xK |  D]C } |  j  | j ƒ  } x' | d d … D] } | d | f Vq1 Wq Wd S)z8Iterate over all header lines, including duplicate ones.r   Nr   )r   r   )r   r   r3   r   r   r   r   rA     s    zHTTPHeaderDict.iteritemsc             c   sJ   xC |  D]; } |  j  | j ƒ  } | d d j | d d … ƒ f Vq Wd S)z:Iterate over all headers, merging duplicate ones together.r   z, r   N)r   r   r    )r   r   r   r   r   r   r,     s    zHTTPHeaderDict.itermergedc             C   s   t  |  j ƒ  ƒ S)N)r<   rA   )r   r   r   r   rB     s    zHTTPHeaderDict.itemsc             C   s•   g  } x‚ | j  D]w } | j d ƒ rV | d \ } } | | d | j ƒ  f | d <q | j d d ƒ \ } } | j | | j ƒ  f ƒ q W|  | ƒ S)	z4Read headers from a Python 2 httplib message object.ú ú	r   z
ú:)rI   rJ   éÿÿÿÿrL   )r   Ú
startswithÚrstripÚsplitr=   Ústrip)ÚclsÚmessager   Úliner   r8   r   r   r   Úfrom_httplib  s    zHTTPHeaderDict.from_httplib)#rF   Ú
__module__Ú__qualname__Ú__doc__r   r   r!   r"   r#   r.   r/   ÚPY3r   ZiterkeysZ
itervaluesÚobjectr6   r1   r4   r9   r:   r>   r   rE   Z
getheadersZgetallmatchingheadersZigetrG   r   rH   rA   r,   rB   ÚclassmethodrT   r   r   )r   r   r   E   s:    			r   Ú
basestringr   r   r   r   r	   Úqueuer   Ú
gaecontribr   )r   r   )z
basestringz
connectionzfieldszfilepostzpoolmanagerztimeoutr   zqueuez	urlencodez
gaecontribzurljoin)'rW   Úcollectionsr   r   ÚsysZrequestsZrequests.packages.urllib3r   r   r   ÚImportErrorZurllib3Z$requests.packages.urllib3.connectionr   r   Zurllib3.connectionZ	__build__r	   Zrequests.packages.urllib3.utilZurllib3.utilr]   Z!requests.packages.urllib3.contribr
   Zurllib3.contribÚversion_inforX   r\   Zurllib.parser   r   ZQueueZurllibZurlparser[   Ú	NameErrorÚstrÚbytesr   Ú__all__r   r   r   r   Ú<module>
   sp   		
æ          