VY:'@sddlmZddlmZmZyddlmZWn%ek raGdddZYnXyddlmZWn"ek rddl mZYnXddl m Z m Z m Z d d gZeZGd d d eZGd d d eZd S))absolute_import)MappingMutableMapping)RLockc@s(eZdZddZddZdS)rcCsdS)N)selfrrJ/tmp/pip-build-04bmskau/requests/requests/packages/urllib3/_collections.py __enter__szRLock.__enter__cCsdS)Nr)rexc_type exc_value tracebackrrr__exit__ szRLock.__exit__N)__name__ __module__ __qualname__r r rrrrrs  r) OrderedDict)iterkeys itervaluesPY3RecentlyUsedContainerHTTPHeaderDictc@seZdZdZeZddddZddZdd Zd d Z d d Z ddZ ddZ ddZ dS)ra 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 NcCs1||_||_|j|_t|_dS)N)_maxsize dispose_func ContainerCls _containerrlock)rmaxsizerrrr__init__+s  zRecentlyUsedContainer.__init__c Cs8|j(|jj|}||j|<|SWdQRXdS)N)rrpop)rkeyitemrrr __getitem__2s  z!RecentlyUsedContainer.__getitem__c Cst}|jZ|jj|t}||j|>> 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 sntt|jt|_|dk rWt|trJ|j|n |j||rj|j|dS)N)superrrrr isinstance _copy_fromextend)rheaderskwargs) __class__rrrs   zHTTPHeaderDict.__init__cCs*||g|j|j<|j|jS)N)rlower)rr!valrrrr,szHTTPHeaderDict.__setitem__cCs*|j|j}dj|ddS)Nz, r)rr=join)rr!r>rrrr#szHTTPHeaderDict.__getitem__cCs|j|j=dS)N)rr=)rr!rrrr-szHTTPHeaderDict.__delitem__cCs|j|jkS)N)r=r)rr!rrr __contains__szHTTPHeaderDict.__contains__cCst|t r$t|d r$dSt|t|sKt||}tdd|jDtdd|jDkS)Nr4Fcss'|]\}}|j|fVqdS)N)r=).0kvrrr sz(HTTPHeaderDict.__eq__..css'|]\}}|j|fVqdS)N)r=)rArBrCrrrrDs)r7rhasattrtypedict itermerged)rotherrrr__eq__s  zHTTPHeaderDict.__eq__cCs|j| S)N)rJ)rrIrrr__ne__szHTTPHeaderDict.__ne__cCs t|jS)N)r'r)rrrrr.szHTTPHeaderDict.__len__ccs'x |jjD]}|dVqWdS)Nr)rr3)rvalsrrrr0szHTTPHeaderDict.__iter__c CsHy||}Wn(tk r8||jkr0|SYn X||=|SdS)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)rr!defaultr)rrrr s  zHTTPHeaderDict.popc Cs$y ||=Wntk rYnXdS)N)rM)rr!rrrdiscards  zHTTPHeaderDict.discardcCsJ|j}||g}|jj||}||k rF|j|dS)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 setdefaultappend)rr!r> key_lowernew_valsrLrrradds   zHTTPHeaderDict.addcOsZt|dkr-tdjt|t|dkrI|dnf}t|trx|jD]\}}|j||qkWnt|trx|D]}|j|||qWndt|drxR|j D]}|j|||qWn'x$|D]\}}|j||q Wx*|j D]\}}|j||q6WdS)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__ rz9extend() takes at most 1 positional arguments ({0} given)rr4N) r' TypeErrorformatr7r iteritemsrUrrEr4items)rargsr;rIr!r>r)rrrr9s" " zHTTPHeaderDict.extendc CsBy|j|j}Wntk r/gSYnX|ddSdS)zmReturns a list of all the values for the named field. Returns an empty list if the key doesn't exist.rN)rr=rM)rr!rLrrrgetlists   zHTTPHeaderDict.getlistcCs#dt|jt|jfS)Nz%s(%s))rFrrGrH)rrrr__repr__ szHTTPHeaderDict.__repr__cCsYxR|D]J}|j|}t|tr7t|}|g||j|jrrrr8 s   zHTTPHeaderDict._copy_fromcCs t|}|j||S)N)rFr8)rclonerrrcopys zHTTPHeaderDict.copyccsRxK|D]C}|j|j}x'|ddD]}|d|fVq1WqWdS)z8Iterate over all header lines, including duplicate ones.rNr)rr=)rr!rLr>rrrrXs zHTTPHeaderDict.iteritemsccsJxC|D];}|j|j}|ddj|ddfVqWdS)z:Iterate over all headers, merging duplicate ones together.rz, rN)rr=r?)rr!r>rrrrH s zHTTPHeaderDict.itermergedcCst|jS)N)r1rX)rrrrrY&szHTTPHeaderDict.itemscCsg}x|jD]w}|jdrV|d\}}||d|jf|ds    J