diff options
| author | Yuval Adam <_@yuv.al> | 2018-02-19 22:18:15 +0100 |
|---|---|---|
| committer | Yuval Adam <_@yuv.al> | 2018-02-19 22:18:15 +0100 |
| commit | 647ac4e5507f458b02883c7b84a57cfe971b732d (patch) | |
| tree | b0bb573192e8f6a7e9c5726cfe4e55fd4ec2a57f | |
| parent | 945dadfae8047c8c74d8b2b50486156198926568 (diff) | |
Add basic dict support
| -rw-r--r-- | tests/test_core.py | 5 | ||||
| -rw-r--r-- | viewstate/core.py | 12 |
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() |
