1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
U
I=®d(*ã@sØddlmZzddlmZmZWn$ek
rDddlmZmZYnXzddlmZWn"ek
rxGdd„dƒZYnXddlm    Z    ddl
m Z dd    l m Z mZmZd
d gZeƒZGd d
„d
eƒZGd d „d eƒZdS)é)Úabsolute_import)ÚMappingÚMutableMapping)ÚRLockc@seZdZdd„Zdd„ZdS)rcCsdS©N©©ÚselfrrúWD:\z\workplace\VsCode\pyvenv\venv\Lib\site-packages\pip/_vendor/urllib3/_collections.pyÚ    __enter__ szRLock.__enter__cCsdSrr)r    Úexc_typeÚ    exc_valueÚ    tracebackrrr
Ú__exit__szRLock.__exit__N)Ú__name__Ú
__module__Ú __qualname__r rrrrr
r sr)Ú OrderedDicté)Ú InvalidHeader)ÚiterkeysÚ
itervaluesÚPY3ÚRecentlyUsedContainerÚHTTPHeaderDictc@sVeZdZdZeZddd„Zdd„Zdd    „Zd
d „Z    d d „Z
dd„Z dd„Z dd„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
    é
NcCs"||_||_| ¡|_tƒ|_dSr)Ú_maxsizeÚ dispose_funcÚ ContainerClsÚ
_containerrÚlock)r    Úmaxsizerrrr
Ú__init__.s
zRecentlyUsedContainer.__init__c
Cs8|j(|j |¡}||j|<|W5QR£SQRXdSr)r rÚpop)r    ÚkeyÚitemrrr
Ú __getitem__5s 
z!RecentlyUsedContainer.__getitem__c    Cslt}|j@|j |t¡}||j|<t|jƒ|jkrF|jjdd\}}W5QRX|jrh|tk    rh| |¡dS)NF)Úlast)Ú_Nullr rÚgetÚlenrÚpopitemr)r    r$ÚvalueÚ evicted_valueÚ_keyrrr
Ú __setitem__<s
z!RecentlyUsedContainer.__setitem__c    Cs2|j|j |¡}W5QRX|jr.| |¡dSr)r rr#r)r    r$r,rrr
Ú __delitem__Ksz!RecentlyUsedContainer.__delitem__c
Cs(|jt|jƒW5QR£SQRXdSr)r r*rrrrr
Ú__len__RszRecentlyUsedContainer.__len__cCs tdƒ‚dS)Nz7Iteration over this class is unlikely to be threadsafe.)ÚNotImplementedErrorrrrr
Ú__iter__VsÿzRecentlyUsedContainer.__iter__c    CsH|jtt|jƒƒ}|j ¡W5QRX|jrD|D]}| |¡q4dSr)r ÚlistrrÚclearr)r    Úvaluesr,rrr
r5[s zRecentlyUsedContainer.clearc
Cs,|jtt|jƒƒW5QR£SQRXdSr)r r4rrrrrr
ÚkeyseszRecentlyUsedContainer.keys)rN)rrrÚ__doc__rrr"r&r/r0r1r3r5r7rrrr
rs 
 
csôeZdZdZd-‡fdd„    Zdd„Zdd„Zd    d
„Zd d „Zd d„Z    dd„Z
e sZe j Z e jZeƒZdd„Zdd„Zefdd„Zdd„Zdd„Zdd„Zefdd„ZeZeZeZeZdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Z d)d*„Z!e"d+d,„ƒZ#‡Z$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 sPtt|ƒ ¡tƒ|_|dk    r>t|tƒr4| |¡n
| |¡|rL| |¡dSr)Úsuperrr"rrÚ
isinstanceÚ
_copy_fromÚextend)r    ÚheadersÚkwargs©Ú    __class__rr
r"Œs
 
zHTTPHeaderDict.__init__cCs ||g|j| ¡<|j| ¡Sr©rÚlower©r    r$Úvalrrr
r/—szHTTPHeaderDict.__setitem__cCs |j| ¡}d |dd…¡S)Nú, r©rrBÚjoinrCrrr
r&›szHTTPHeaderDict.__getitem__cCs|j| ¡=dSrrA©r    r$rrr
r0ŸszHTTPHeaderDict.__delitem__cCs| ¡|jkSr)rBrrHrrr
Ú __contains__¢szHTTPHeaderDict.__contains__cCs^t|tƒst|dƒsdSt|t|ƒƒs2t|ƒ|ƒ}tdd„| ¡Dƒƒtdd„| ¡DƒƒkS)Nr7Fcss|]\}}| ¡|fVqdSr)rB)Ú.0ÚkÚvrrr
Ú    <genexpr>ªsz(HTTPHeaderDict.__eq__.<locals>.<genexpr>)r:rÚhasattrÚtypeÚdictÚ
itermerged©r    Úotherrrr
Ú__eq__¥s ÿzHTTPHeaderDict.__eq__cCs | |¡ Sr)rTrRrrr
Ú__ne__®szHTTPHeaderDict.__ne__cCs
t|jƒSr)r*rrrrr
r1·szHTTPHeaderDict.__len__ccs|j ¡D]}|dVq
dS)Nr)rr6)r    Úvalsrrr
r3ºszHTTPHeaderDict.__iter__cCs@z ||}Wn$tk
r0||jkr(‚|YSX||=|SdS)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,rrr
r#¿s 
 
zHTTPHeaderDict.popcCs$z
||=Wntk
rYnXdSr)rWrHrrr
ÚdiscardÐs
zHTTPHeaderDict.discardcCs4| ¡}||g}|j ||¡}||k    r0| |¡dS)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)rBrÚ
setdefaultÚappend)r    r$rDÚ    key_lowerÚnew_valsrVrrr
ÚaddÖs
    zHTTPHeaderDict.addcOsìt|ƒdkrtd t|ƒ¡ƒ‚t|ƒdkr2|dnd}t|tƒr`| ¡D]\}}| ||¡qHnjt|tƒr†|D]}| |||¡qnnDt|dƒr°|     ¡D]}| |||¡q˜n|D]\}}| ||¡q´| 
¡D]\}}| ||¡qÒdS)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__
        rz9extend() takes at most 1 positional arguments ({0} given)rrr7N) r*Ú    TypeErrorÚformatr:rÚ    iteritemsr_rrNr7Úitems)r    Úargsr>rSr$rDr,rrr
r<æs( ÿÿ
 
 
  zHTTPHeaderDict.extendcCsNz|j| ¡}Wn*tk
r<||jkr4gYS|YSX|dd…SdS)zmReturns a list of all the values for the named field. Returns an
        empty list if the key doesn't exist.rN)rrBrWrX)r    r$rYrVrrr
Úgetlists
 
zHTTPHeaderDict.getlistcCsdt|ƒjt| ¡ƒfS)Nz%s(%s))rOrrPrQrrrr
Ú__repr__szHTTPHeaderDict.__repr__cCs>|D]4}| |¡}t|tƒr$t|ƒ}|g||j| ¡<qdSr)rer:r4rrB)r    rSr$rDrrr
r;s
 
 
zHTTPHeaderDict._copy_fromcCst|ƒƒ}| |¡|Sr)rOr;)r    Úclonerrr
Úcopy!s
 
zHTTPHeaderDict.copyccs<|D]2}|j| ¡}|dd…D]}|d|fVq"qdS)z8Iterate over all header lines, including duplicate ones.rNrrA)r    r$rVrDrrr
rb&szHTTPHeaderDict.iteritemsccs8|D].}|j| ¡}|dd |dd…¡fVqdS)z:Iterate over all headers, merging duplicate ones together.rrErNrFrCrrr
rQ-szHTTPHeaderDict.itermergedcCs t| ¡ƒSr)r4rbrrrr
rc3szHTTPHeaderDict.itemscCs€d}g}|jD]h}| |¡rT|s.td|ƒ‚n&|d\}}||d| ¡f|d<q| dd¡\}}| || ¡f¡q||ƒS)z4Read headers from a Python 2 httplib message object.)ú ú    z/Header continuation with no previous header: %séÿÿÿÿriú:r)r=Ú
startswithrÚstripÚsplitr\)ÚclsÚmessageÚobs_fold_continued_leadersr=Úliner$r,rrr
Ú from_httplib6s
 
ÿ zHTTPHeaderDict.from_httplib)N)%rrrr8r"r/r&r0rIrTrUrrrrÚobjectrXr1r3r#rZr_r<reÚ
getheadersÚgetallmatchingheadersÚigetÚget_allrfr;rhrbrQrcÚ classmethodrtÚ __classcell__rrr?r
rjs>!       N)Ú
__future__rÚcollections.abcrrÚ ImportErrorÚ collectionsÚ    threadingrrÚ
exceptionsrZ packages.sixrrrÚ__all__rur(rrrrrr
Ú<module>s   L