B
    @)H[)  ã               @   sÈ   d dl mZ d dlmZmZ yd dlmZ W n" ek
rN   G dd„ dƒZY nX yd dlmZ W n  ek
r€   ddl	mZ Y nX ddl
mZ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   s   d S )N© )Úselfr   r   úaC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-qz7kpjmn\pip\pip\_vendor\urllib3\_collections.pyÚ	__enter__   s    zRLock.__enter__c             C   s   d S )Nr   )r   Úexc_typeÚ	exc_valueÚ	tracebackr   r   r   Ú__exit__
   s    zRLock.__exit__N)Ú__name__Ú
__module__Ú__qualname__r	   r   r   r   r   r   r      s   r   )ÚOrderedDicté   )ÚiterkeysÚ
itervaluesÚPY3Ú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 )N)Ú_maxsizeÚdispose_funcÚContainerClsÚ
_containerr   Úlock)r   Úmaxsizer   r   r   r   Ú__init__+   s    
zRecentlyUsedContainer.__init__c          	   C   s,   | j � | j |¡}|| j|< |S Q R X d S )N)r   r   Úpop)r   ÚkeyÚitemr   r   r   Ú__getitem__2   s    
z!RecentlyUsedContainer.__getitem__c          	   C   sl   t }| j�@ | j |t ¡}|| j|< t| jƒ| jkrF| jjdd�\}}W d Q R X | jrh|t k	rh|  |¡ d S )NF)Úlast)Ú_Nullr   r   ÚgetÚlenr   Úpopitemr   )r   r!   ÚvalueÚevicted_valueÚ_keyr   r   r   Ú__setitem__9   s    
z!RecentlyUsedContainer.__setitem__c          	   C   s2   | j � | j |¡}W d Q R X | jr.|  |¡ d S )N)r   r   r    r   )r   r!   r)   r   r   r   Ú__delitem__H   s    z!RecentlyUsedContainer.__delitem__c          	   C   s   | j � t| jƒS Q R X d S )N)r   r'   r   )r   r   r   r   Ú__len__O   s    zRecentlyUsedContainer.__len__c             C   s   t dƒ‚d S )Nz7Iteration over this class is unlikely to be threadsafe.)ÚNotImplementedError)r   r   r   r   Ú__iter__S   s    zRecentlyUsedContainer.__iter__c          	   C   sL   | j � tt| jƒƒ}| j ¡  W d Q R X | jrHx|D ]}|  |¡ q6W d S )N)r   Úlistr   r   Úclearr   )r   Úvaluesr)   r   r   r   r2   V   s    
zRecentlyUsedContainer.clearc          	   C   s    | j � tt| jƒƒS Q R X d S )N)r   r1   r   r   )r   r   r   r   Úkeys`   s    zRecentlyUsedContainer.keys)r   N)r   r   r   Ú__doc__r   r   r   r#   r,   r-   r.   r0   r2   r4   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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ef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 ).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                sP   t t| ƒ ¡  tƒ | _|d k	r>t|tƒr4|  |¡ n
|  |¡ |rL|  |¡ d S )N)Ú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 )N)r   Úlower)r   r!   Úvalr   r   r   r,   ’   s    zHTTPHeaderDict.__setitem__c             C   s    | j | ¡  }d |dd … ¡S )Nz, r   )r   r=   Újoin)r   r!   r>   r   r   r   r#   –   s    zHTTPHeaderDict.__getitem__c             C   s   | j | ¡ = d S )N)r   r=   )r   r!   r   r   r   r-   š   s    zHTTPHeaderDict.__delitem__c             C   s   |  ¡ | jkS )N)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 )Nr4   Fc             s   s   | ]\}}|  ¡ |fV  qd S )N)r=   )Ú.0ÚkÚvr   r   r   ú	<genexpr>¥   s    z(HTTPHeaderDict.__eq__.<locals>.<genexpr>c             s   s   | ]\}}|  ¡ |fV  qd S )N)r=   )rA   rB   rC   r   r   r   rD   ¦   s    )r7   r   ÚhasattrÚtypeÚdictÚ
itermerged)r   Úotherr   r   r   Ú__eq__    s    zHTTPHeaderDict.__eq__c             C   s   |   |¡ S )N)rJ   )r   rI   r   r   r   Ú__ne__¨   s    zHTTPHeaderDict.__ne__c             C   s
   t | jƒS )N)r'   r   )r   r   r   r   r.   ±   s    zHTTPHeaderDict.__len__c             c   s"   x| j  ¡ D ]}|d V  qW d S )Nr   )r   r3   )r   Úvalsr   r   r   r0   ´   s    zHTTPHeaderDict.__iter__c             C   s<   y| | }W n  t k
r,   || jkr(‚ |S X | |= |S d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.
        N)ÚKeyErrorÚ_HTTPHeaderDict__marker)r   r!   Údefaultr)   r   r   r   r    ¹   s    
zHTTPHeaderDict.popc             C   s$   y
| |= W n t k
r   Y nX d S )N)rM   )r   r!   r   r   r   ÚdiscardÊ   s    
zHTTPHeaderDict.discardc             C   s4   |  ¡ }||g}| j ||¡}||k	r0| |¡ 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)r=   r   Ú
setdefaultÚappend)r   r!   r>   Ú	key_lowerÚnew_valsrL   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ƒrdx˜| ¡ D ]\}}|  ||¡ qJW nvt|tƒrŽxj|D ]}|  ||| ¡ qtW nLt|dƒr¼x@| 	¡ D ]}|  ||| ¡ q¢W nx|D ]\}}|  ||¡ qÂW x | 
¡ D ]\}}|  ||¡ qäW 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   z9extend() takes at most 1 positional arguments ({0} given)r   r   r4   N)r'   Ú	TypeErrorÚformatr7   r   Ú	iteritemsrU   r   rE   r4   Úitems)r   Úargsr;   rI   r!   r>   r)   r   r   r   r9   à   s"    



zHTTPHeaderDict.extendc             C   sF   y| j | ¡  }W n" tk
r4   || jkr0g S |S X |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=   rM   rN   )r   r!   rO   rL   r   r   r   Úgetlistú   s    
zHTTPHeaderDict.getlistc             C   s   dt | ƒjt|  ¡ ƒf S )Nz%s(%s))rF   r   rG   rH   )r   r   r   r   Ú__repr__  s    zHTTPHeaderDict.__repr__c             C   sB   x<|D ]4}|  |¡}t|tƒr&t|ƒ}|g| | j| ¡ < qW d S )N)r[   r7   r1   r   r=   )r   rI   r!   r>   r   r   r   r8     s
    


zHTTPHeaderDict._copy_fromc             C   s   t | ƒƒ }| | ¡ |S )N)rF   r8   )r   Úcloner   r   r   Úcopy  s    

zHTTPHeaderDict.copyc             c   sD   x>| D ]6}| j | ¡  }x"|dd… D ]}|d |fV  q&W qW dS )z8Iterate over all header lines, including duplicate ones.r   Nr   )r   r=   )r   r!   rL   r>   r   r   r   rX     s    
zHTTPHeaderDict.iteritemsc             c   s<   x6| D ].}| j | ¡  }|d d |dd… ¡fV  qW dS )z:Iterate over all headers, merging duplicate ones together.r   z, r   N)r   r=   r?   )r   r!   r>   r   r   r   rH   %  s    
zHTTPHeaderDict.itermergedc             C   s   t |  ¡ ƒS )N)r1   rX   )r   r   r   r   rY   +  s    zHTTPHeaderDict.itemsc             C   sn   g }x`|j D ]V}| d¡r@|d \}}||d | ¡  f|d< q| dd¡\}}| || ¡ f¡ qW | |ƒS )z4Read headers from a Python 2 httplib message object.)ú ú	éÿÿÿÿz
ú:r   )r:   Ú
startswithÚrstripÚsplitrR   Ústrip)ÚclsÚmessager:   Úliner!   r)   r   r   r   Úfrom_httplib.  s    
zHTTPHeaderDict.from_httplib)N)%r   r   r   r5   r   r,   r#   r-   r@   rJ   rK   r   r   r   r   ÚobjectrN   r.   r0   r    rP   rU   r9   r[   Ú
getheadersÚgetallmatchingheadersÚigetÚget_allr\   r8   r^   rX   rH   rY   Úclassmethodrj   Ú__classcell__r   r   )r<   r   r   e   s<    N)Ú
__future__r   Úcollectionsr   r   Ú	threadingr   ÚImportErrorr   Zpackages.ordered_dictZpackages.sixr   r   r   Ú__all__rk   r%   r   r   r   r   r   r   Ú<module>   s   J