aboutsummaryrefslogtreecommitdiffstats
path: root/netlib/http/message.py
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2016-05-21 11:37:36 +1200
committerAldo Cortesi <aldo@nullcube.com>2016-05-21 11:37:36 +1200
commita5c4cd034081d7dcdbd4b46bd69718edb45d4719 (patch)
tree52accc866d25c735e6c36f05255bb3f5349f8ac7 /netlib/http/message.py
parent96d8ec1ee33b076a472afc3053fdd8256559fcc3 (diff)
downloadmitmproxy-a5c4cd034081d7dcdbd4b46bd69718edb45d4719.tar.gz
mitmproxy-a5c4cd034081d7dcdbd4b46bd69718edb45d4719.tar.bz2
mitmproxy-a5c4cd034081d7dcdbd4b46bd69718edb45d4719.zip
A clearer implementation of MultiDictView
This makes MultiDictView work with a simple getter/setter pair, rather than using attributes with implicit leading underscores. Also move MultiDictView into multidict.py and adds some simple unit tests.
Diffstat (limited to 'netlib/http/message.py')
-rw-r--r--netlib/http/message.py69
1 files changed, 0 insertions, 69 deletions
diff --git a/netlib/http/message.py b/netlib/http/message.py
index db4054b1..9b0180cf 100644
--- a/netlib/http/message.py
+++ b/netlib/http/message.py
@@ -236,72 +236,3 @@ class decoded(object):
def __exit__(self, type, value, tb):
if self.ce:
self.message.encode(self.ce)
-
-
-class MultiDictView(MultiDict):
- """
- Some parts in HTTP (Cookies, URL query strings, ...) require a specific data structure: A MultiDict.
- It behaves mostly like an ordered dict but it can have several values for the same key.
-
- The MultiDictView provides a MultiDict *view* on an :py:class:`Request` or :py:class:`Response`.
- That is, it represents a part of the request as a MultiDict, but doesn't contain state/data themselves.
-
- For example, ``request.cookies`` provides a view on the ``Cookie: ...`` header.
- Any change to ``request.cookies`` will also modify the ``Cookie`` header.
- Any change to the ``Cookie`` header will also modify ``request.cookies``.
-
- Example:
-
- .. code-block:: python
-
- # Cookies are represented as a MultiDict.
- >>> request.cookies
- MultiDictView[("name", "value"), ("a", "false"), ("a", "42")]
-
- # MultiDicts mostly behave like a normal dict.
- >>> request.cookies["name"]
- "value"
-
- # If there is more than one value, only the first value is returned.
- >>> request.cookies["a"]
- "false"
-
- # `.get_all(key)` returns a list of all values.
- >>> request.cookies.get_all("a")
- ["false", "42"]
-
- # Changes to the headers are immediately reflected in the cookies.
- >>> request.cookies
- MultiDictView[("name", "value"), ...]
- >>> del request.headers["Cookie"]
- >>> request.cookies
- MultiDictView[] # empty now
- """
-
- def __init__(self, attr, message):
- if False: # pragma: no cover
- # We do not want to call the parent constructor here as that
- # would cause an unnecessary parse/unparse pass.
- # This is here to silence linters. Message
- super(MultiDictView, self).__init__(None)
- self._attr = attr
- self._message = message # type: Message
-
- @staticmethod
- def _kconv(key):
- # All request-attributes are case-sensitive.
- return key
-
- @staticmethod
- def _reduce_values(values):
- # We just return the first element if
- # multiple elements exist with the same key.
- return values[0]
-
- @property
- def fields(self):
- return getattr(self._message, "_" + self._attr)
-
- @fields.setter
- def fields(self, value):
- setattr(self._message, self._attr, value)