fgS,ddlmZ ddlmZmZn#e$r ddlmZmZYnwxYw ddlmZn#e$rGddZYnwxYwddlm Z ddl m Z dd l Z dd l m Z mZd d gZeZGd d eZGdd eZd S))absolute_import)MappingMutableMapping)RLockceZdZdZdZdS)rcdSNselfs 6/usr/lib/python3/dist-packages/urllib3/_collections.py __enter__zRLock.__enter__  DcdSr r )r exc_type exc_value tracebacks r __exit__zRLock.__exit__rrN)__name__ __module__ __qualname__rrr rr rr s2        rr) OrderedDict) InvalidHeaderN)iterkeys itervaluesRecentlyUsedContainerHTTPHeaderDictcHeZdZdZeZd dZdZdZdZ dZ d Z d Z d Z 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 Ncz||_||_||_t |_dSr )_maxsize dispose_func ContainerCls _containerrlock)r maxsizer$s r __init__zRecentlyUsedContainer.__init__/s3 (++--GG rc|j5|j|}||j|<|cdddS#1swxYwYdSr )r'r&pop)r keyitems r __getitem__z!RecentlyUsedContainer.__getitem__6s Y  ?&&s++D#'DOC                   s &;??cnt}|j5|j|t}||j|<t |j|jkr|jd\}}dddn #1swxYwY|jr |tur||dSdSdS)NF)last)_Nullr'r&getlenr#popitemr$)r r,value evicted_value_keys r __setitem__z!RecentlyUsedContainer.__setitem__=s Y J J O//U;;M#(DOC 4?##dm33&*o&=&=5&=&I&I#m J J J J J J J J J J J J J J J   -e!;!;   m , , , , , - -!;!;sA&BBBc|j5|j|}dddn #1swxYwY|jr||dSdSr )r'r&r+r$)r r,r5s r __delitem__z!RecentlyUsedContainer.__delitem__Ls Y - -O'',,E - - - - - - - - - - - - - - -   %   e $ $ $ $ $ % %s /33cl|j5t|jcdddS#1swxYwYdSr )r'r3r&r s r __len__zRecentlyUsedContainer.__len__Ss{ Y ( (t'' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s )--c td)Nz7Iteration over this class is unlikely to be threadsafe.)NotImplementedErrorr s r __iter__zRecentlyUsedContainer.__iter__Ws! E   rc|j5tt|j}|jdddn #1swxYwY|jr|D]}||dSdSr )r'listrr&clearr$)r valuesr5s r rBzRecentlyUsedContainer.clear\s Y $ $*T_5566F O ! ! # # # $ $ $ $ $ $ $ $ $ $ $ $ $ $ $   ) ) )!!%(((( ) ) ) )s;AAAc|j5tt|jcdddS#1swxYwYdSr )r'rArr&r s r keyszRecentlyUsedContainer.keysfs Y 3 31122 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3s !6::)r!N)rrr__doc__rr%r)r.r8r:r<r?rBrEr rr rrs  L - - -%%%(((   )))33333rceZdZdZdfd ZdZdZdZdZdZ d Z e j re jZe jZeZd Zd Zefd Zd ZdZdZefdZdZeZeZeZeZdZdZdZ dZ!dZ"dZ#e$dZ%xZ&S)rap :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 2tt|t|_|@t |tr||n|||r||dSdSr )superrr)rr& isinstance _copy_fromextend)r headerskwargs __class__s r r)zHTTPHeaderDict.__init__s nd##,,...%--  '>22 %(((( G$$$  KK       rc|||g|j|<|j|Sr r&lowerr r,vals r r8zHTTPHeaderDict.__setitem__s/(+Sz $syy{{++rcz|j|}d|ddS)N, rr&rRjoinrSs r r.zHTTPHeaderDict.__getitem__s0ociikk*yyQRR!!!rc:|j|=dSr rQr r,s r r:zHTTPHeaderDict.__delitem__s OCIIKK ( ( (rc8||jvSr )rRr&rZs r __contains__zHTTPHeaderDict.__contains__syy{{do--rcjt|tst|dsdSt|t|st||}t d|Dt d|DkS)NrEFc3HK|]\}}||fVdSr rR.0kvs r z(HTTPHeaderDict.__eq__..s2AAtq!QWWYYNAAAAAArc3HK|]\}}||fVdSr r_r`s r rdz(HTTPHeaderDict.__eq__..sKJ J #q!QWWYYNJ J J J J J r)rJrhasattrtypedict itermergedr others r __eq__zHTTPHeaderDict.__eq__s%)) '%2H2H 5%d,, &DJJu%%EAAt/@/@AAAAATJ J ','7'7'9'9J J J F F   rc.|| Sr )rlrjs r __ne__zHTTPHeaderDict.__ne__s;;u%%%%rc*t|jSr )r3r&r s r r<zHTTPHeaderDict.__len__s4?###rc#VK|jD] }|dV dS)Nr)r&rC)r valss r r?zHTTPHeaderDict.__iter__s<O**,,  Dq'MMMM  rcV ||}||=|S#t$r||jur|cYSwxYw)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. )KeyError_HTTPHeaderDict__marker)r r,defaultr5s r r+zHTTPHeaderDict.popsT IE S L    $-''NNN s ((c0 ||=dS#t$rYdSwxYwr )rsrZs r discardzHTTPHeaderDict.discards4 S     DD s  c|}||g}|j||}||ur||dSdS)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)rRr& setdefaultappend)r r,rT key_lowernew_valsrqs r addzHTTPHeaderDict.adds\IIKK :)))X>> 4   KK      rct|dkr/tdt|t|dkr|dnd}t|tr1|D]\}}|||nt|tr"|D]}||||nbt|dr4| D]}||||n|D]\}}|||| D]\}}|||dS)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)rr rEN) r3 TypeErrorformatrJr iteritemsr}rrfrEitems)r argsrNrkr,rTr5s r rLzHTTPHeaderDict.extends t99q==((.s4yy(9(9 t99>>Qr e^ , , %!OO-- # #Sc"""" # w ' ' % * *eCj)))) * UF # # %zz|| * *eCj)))) *$ % % Ue$$$$ ,,.. ! !JC HHS%  ! !rc |j|}|ddS#t$r||jurgcYS|cYSwxYw)zmReturns a list of all the values for the named field. Returns an empty list if the key doesn't exist.rN)r&rRrsrt)r r,rurqs r getlistzHTTPHeaderDict.getlistsf ?399;;/D 8O    $-'' NNN s+AAAcBgd}|D]}|||S)z Remove content-specific header fields before changing the request method to GET or HEAD according to RFC 9110, Section 15.4. )zContent-EncodingzContent-LanguagezContent-Locationz Content-TypezContent-LengthDigestz Last-Modified)rw)r content_specific_headersheaders r _prepare_for_method_changez)HTTPHeaderDict._prepare_for_method_changes? $ $ $  / ! !F LL  rctt|jdt|dS)N())rgrrhrir s r __repr__zHTTPHeaderDict.__repr__)s4::...T__5F5F0G0G0G0GHHrc|D][}||}t|trt|}|g|z|j|<\dSr )rrJrAr&rR)r rkr,rTs r rKzHTTPHeaderDict._copy_from,sf 7 7C--$$C#t$$ 3ii,/53;DOCIIKK ( (  7 7rc^t|}|||Sr )rgrK)r clones r copyzHTTPHeaderDict.copy4s,T   rc#K|D]:}|j|}|ddD]}|d|fV;dS)z8Iterate over all header lines, including duplicate ones.rNrrQ)r r,rqrTs r rzHTTPHeaderDict.iteritems9sf # #C?399;;/DABBx # #1gsl"""" # # #rc#K|D]H}|j|}|dd|ddfVIdS)z:Iterate over all headers, merging duplicate ones together.rrVrNrWrSs r rizHTTPHeaderDict.itermerged@s_ - -C/#))++.Ca&$))CG,,, , , , , - -rcDt|Sr )rArr s r rzHTTPHeaderDict.itemsFsDNN$$%%%rc`d}g}|jD]}||r?|std|z|d\}}||dz|zf|d<V|dd\}}|||f||S)z4Read headers from a Python 2 httplib message object.)  z/Header continuation with no previous header: %sr:r)rM startswithrstripsplitrz)clsmessageobs_fold_continued_leadersrMliner,r5s r from_httplibzHTTPHeaderDict.from_httplibIs &1"O 1 1D9::  (IDP")JC#& djjll(B"CGBKC++JC NNC/ 0 0 0 0s7||rr )'rrrrFr)r8r.r:r\rlrnsixPY2rrrobjectrtr<r?r+rwr}rLrr getheadersgetallmatchingheadersigetget_allrrKrrrir classmethodr __classcell__)rOs@r rrksB       ,,,""")))...   &&& w/!*#. vxxH$$$ ("  !!!8$,    &J# DGIII777 ###--- &&&[r) __future__rcollections.abcrr ImportError collections threadingrr exceptionsrrrr__all__rr1rrr rr rs&&&&&&477777777744433333333334 $#####%%%%%% $$$$$$$$ "$4 5 I3I3I3I3I3NI3I3I3Xxxxxx^xxxxxs !!,AA