summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/test_core.py5
-rw-r--r--viewstate/__main__.py4
-rw-r--r--viewstate/core.py12
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: