diff options
| -rw-r--r-- | tests/test_core.py | 5 | ||||
| -rw-r--r-- | viewstate/__main__.py | 4 | ||||
| -rw-r--r-- | viewstate/core.py | 12 |
3 files changed, 19 insertions, 2 deletions
diff --git a/tests/test_core.py b/tests/test_core.py index 617a9a7..a1a39a4 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -40,6 +40,11 @@ class TestViewState(object): 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_list(self): + vs = ViewState() + vs.raw = b'\xff\x01\x16\x05\x05\x01a\x05\x01b\x05\x01c\x05\x01d\x05\x01e' + assert vs.decode() == ['a', 'b', 'c', 'd', 'e'] + def test_parse_simple_pair(self): vs = ViewState() vs.raw = b'\xff\x01\x0f\x67\x68' diff --git a/viewstate/__main__.py b/viewstate/__main__.py index c9244d1..16f2919 100644 --- a/viewstate/__main__.py +++ b/viewstate/__main__.py @@ -1,3 +1,4 @@ +import pprint import sys from .core import ViewState @@ -5,7 +6,8 @@ from .core import ViewState def main(): s = sys.stdin.read() vs = ViewState(s) - print(vs.decode()) + pp = pprint.PrettyPrinter(indent=4) + pp.pprint(vs.decode()) if __name__ == '__main__': main() diff --git a/viewstate/core.py b/viewstate/core.py index d779fe7..24db8a6 100644 --- a/viewstate/core.py +++ b/viewstate/core.py @@ -24,6 +24,15 @@ def parse_pair(b): second, remain = _parse(remain) return (first, second), remain +def parse_array(b): + n = b[0] + l = [] + remain = b[1:] + for _ in range(n): + val, remain = _parse(remain) + l.append(val) + return l, remain + def parse_dict(b): n = b[0] d = {} @@ -40,7 +49,6 @@ def _parse(b): return None else: assert type(b) == bytes().__class__ - print(b) if 100 <= b[0] <= 104: return parse_const(b[0]), b[1:] @@ -48,6 +56,8 @@ def _parse(b): return parse_string(b[1:]) elif b[0] == 0xf: return parse_pair(b[1:]) + elif b[0] == 0x16: + return parse_array(b[1:]) elif b[0] == 0x18: return parse_dict(b[1:]) else: |
