3
g;*                 @   s   d dl mZ yd dlmZmZ W n$ ek
rD   d dlmZmZ Y nX yd dlmZ W n" ek
rx   G dd dZY nX 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 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   ^/var/www/tester-filtro-web/env/lib/python3.6/site-packages/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   )InvalidHeader)six)iterkeys
itervalues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"   || _ || _| j | _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|}|| j|< |S Q R X d S )N)r   r   pop)r   keyitemr   r   r   __getitem__6   s    
z!RecentlyUsedContainer.__getitem__c          
   C   sl   t }| j@ | jj|t }|| j|< t| j| jkrF| jjdd\}}W d Q R X | jrh|t k	rh| j| d S )NF)last)_Nullr   r   getlenr   popitemr   )r   r"   valueZevicted_value_keyr   r   r   __setitem__=   s    
z!RecentlyUsedContainer.__setitem__c          	   C   s2   | j  | jj|}W d Q R X | jr.| j| d S )N)r   r   r!   r   )r   r"   r*   r   r   r   __delitem__L   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__S   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__W   s    zRecentlyUsedContainer.__iter__c          
   C   sL   | j  tt| j}| jj  W d Q R X | jrHx|D ]}| j| q6W d S )N)r   listr   r   clearr   )r   valuesr*   r   r   r   r2   \   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   keysf   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jr\e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| j  t | _|d k	r>t|tr4| j| n
| j| |rL| j| 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 < | j |j  S )N)r   lower)r   r"   valr   r   r   r,      s    zHTTPHeaderDict.__setitem__c             C   s    | j |j  }dj|dd  S )Nz, r   )r   r=   join)r   r"   r>   r   r   r   r$      s    zHTTPHeaderDict.__getitem__c             C   s   | j |j = d S )N)r   r=   )r   r"   r   r   r   r-      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   sb   t |t rt|d rdS t |t| s6t| |}tdd | j D tdd |j D kS )Nr4   Fc             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=   )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   | j | 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 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 )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.
        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   |j  }||g}| jj||}||k	r0|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'
        N)r=   r   
setdefaultappend)r   r"   r>   Z	key_lowerZnew_valsrL   r   r   r   add   s
    	zHTTPHeaderDict.addc             O   s   t |dkrtdjt |t |dkr2|d nf }t|trdx|j D ]\}}| j|| qJW nvt|trxj|D ]}| j|||  qtW nLt|drx@|j	 D ]}| j|||  qW nx|D ]\}}| j|| qW x |j
 D ]\}}| j|| qW 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   r4   N)r(   	TypeErrorformatr7   r   	iteritemsrS   r   rE   r4   items)r   argsr;   rI   r"   r>   r*   r   r   r   r9      s$    



zHTTPHeaderDict.extendc             C   sF   y| j |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| j f S )Nz%s(%s))rF   r   rG   rH   )r   r   r   r   __repr__  s    zHTTPHeaderDict.__repr__c             C   sB   x<|D ]4}|j |}t|tr&t|}|g| | j|j < qW d S )N)rY   r7   r1   r   r=   )r   rI   r"   r>   r   r   r   r8     s
    


zHTTPHeaderDict._copy_fromc             C   s   t |  }|j|  |S )N)rF   r8   )r   cloner   r   r   copy"  s    

zHTTPHeaderDict.copyc             c   sD   x>| D ]6}| j |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   rV   '  s    
zHTTPHeaderDict.iteritemsc             c   s<   x6| D ].}| j |j  }|d dj|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 | j S )N)r1   rV   )r   r   r   r   rW   4  s    zHTTPHeaderDict.itemsc             C   s   d}g }xr|j D ]h}|j|rV|s0td| n&|d \}}||d |j  f|d< q|jdd\}}|j||j f qW | |S )	z4Read headers from a Python 2 httplib message object. 	z/Header continuation with no previous header: %sr   :)r]   r^   r`   )r:   
startswithr   stripsplitrR   )clsmessageZobs_fold_continued_leadersr:   liner"   r*   r   r   r   from_httplib7  s    
zHTTPHeaderDict.from_httplib)N)&r   r   r   r5   r    r,   r$   r-   r@   rJ   rK   r   PY2r   r   r   objectrN   r.   r0   r!   rP   rS   r9   rY   
getheadersgetallmatchingheadersZigetget_allrZ   r8   r\   rV   rH   rW   classmethodrg   __classcell__r   r   )r<   r   r   k   s<    	N)
__future__r   collections.abcr   r   ImportErrorcollections	threadingr   r   
exceptionsr   packagesr   Zpackages.sixr   r   __all__ri   r&   r   r   r   r   r   r   <module>   s    L