summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2018-02-19 22:18:15 +0100
committerYuval Adam <_@yuv.al>2018-02-19 22:18:15 +0100
commit647ac4e5507f458b02883c7b84a57cfe971b732d (patch)
treeb0bb573192e8f6a7e9c5726cfe4e55fd4ec2a57f
parent945dadfae8047c8c74d8b2b50486156198926568 (diff)
Add basic dict support
-rw-r--r--tests/test_core.py5
-rw-r--r--viewstate/core.py12
2 files changed, 17 insertions, 0 deletions
diff --git a/tests/test_core.py b/tests/test_core.py
index be4c587..617a9a7 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -35,6 +35,11 @@ class TestViewState(object):
vs.raw = b'\xff\x01\x05\x0a' + s.encode()
assert vs.decode() == s
+ def test_parse_simple_dict(self):
+ vs = ViewState()
+ vs.raw = b'\xff\x01\x18\x02\x05\x01a\x05\x01b\x05\x01c\x05\x01d'
+ assert vs.decode() == {'a': 'b', 'c': 'd'}
+
def test_parse_simple_pair(self):
vs = ViewState()
vs.raw = b'\xff\x01\x0f\x67\x68'
diff --git a/viewstate/core.py b/viewstate/core.py
index fb78743..d779fe7 100644
--- a/viewstate/core.py
+++ b/viewstate/core.py
@@ -24,6 +24,16 @@ def parse_pair(b):
second, remain = _parse(remain)
return (first, second), remain
+def parse_dict(b):
+ n = b[0]
+ d = {}
+ remain = b[1:]
+ for _ in range(n):
+ k, remain = _parse(remain)
+ v, remain = _parse(remain)
+ d[k] = v
+ return d, remain
+
def _parse(b):
if not b:
@@ -38,6 +48,8 @@ def _parse(b):
return parse_string(b[1:])
elif b[0] == 0xf:
return parse_pair(b[1:])
+ elif b[0] == 0x18:
+ return parse_dict(b[1:])
else:
return b, bytes()