Collections¶
These datastructures are used to implement the behaviour of various urllib3 components in a decoupled and application-agnostic design.
- class urllib3._collections.RecentlyUsedContainer(maxsize=10, dispose_func=None)¶
Provides a thread-safe dict-like container which maintains up to maxsize keys while throwing away the least-recently-used keys beyond maxsize.
Parameters: - maxsize – Maximum number of recent elements to retain.
- dispose_func – Every time an item is evicted from the container, dispose_func(value) is called. Callback which will get called
- ContainerCls¶
alias of OrderedDict
- class urllib3._collections.HTTPHeaderDict(headers=None, **kwargs)¶
Parameters: - headers – An iterable of field-value pairs. Must not contain multiple field names when compared case-insensitively.
- 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'
If you want to access the raw headers with their original casing for debugging purposes you can access the private ._data attribute which is a normal python dict that maps the case-insensitive key to a list of tuples stored as (case-sensitive-original-name, value). Using the structure from above as our example:
>>> headers._data {'set-cookie': [('Set-Cookie', 'foo=bar'), ('set-cookie', 'baz=quxx')], 'content-length': [('content-length', '7')]}
- add(key, value)¶
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'
- getlist(key)¶
Returns a list of all the values for the named field. Returns an empty list if the key doesn’t exist.