summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/test_core.py17
-rw-r--r--viewstate/__main__.py2
-rw-r--r--viewstate/core.py27
3 files changed, 40 insertions, 6 deletions
diff --git a/tests/test_core.py b/tests/test_core.py
index d001d22..1b132ac 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -29,3 +29,20 @@ class TestViewState(object):
vs.raw = b'\xff\x01\x67'
assert vs.decode() is True
+ def test_parse_simple_pair(self):
+ vs = ViewState()
+ vs.raw = b'\xff\x01\x0f\x67\x68'
+ assert vs.decode() == (True, False)
+
+ def test_parse_complex_pair(self):
+ vs = ViewState()
+ vs.raw = b'\xff\x01\x0f\x67\x0f\x68\x66'
+ assert vs.decode() == (True, (False, 0))
+ vs.raw = b'\xff\x01\x0f\x0f\x67\x68\x66'
+ assert vs.decode() == ((True, False), 0)
+
+ def test_parse_unknown(self):
+ vs = ViewState()
+ vs.raw = b'\xff\x01\x99\x99\x99'
+ assert vs.decode() == b'\x99\x99\x99'
+
diff --git a/viewstate/__main__.py b/viewstate/__main__.py
index 298aa14..c9244d1 100644
--- a/viewstate/__main__.py
+++ b/viewstate/__main__.py
@@ -5,8 +5,6 @@ from .core import ViewState
def main():
s = sys.stdin.read()
vs = ViewState(s)
- print('Got: ' + s)
- print(vs.raw)
print(vs.decode())
if __name__ == '__main__':
diff --git a/viewstate/core.py b/viewstate/core.py
index e42dbf1..e060a11 100644
--- a/viewstate/core.py
+++ b/viewstate/core.py
@@ -14,12 +14,31 @@ CONSTS = {
def parse_const(b):
return CONSTS.get(b, None)
-def parse(b):
- assert type(b) == bytes().__class__
- if len(b) == 1:
- return parse_const(b[0])
+def parse_pair(b):
+ first, remain = _parse(b)
+ second, remain = _parse(remain)
+ return (first, second), remain
+
+def _parse(b):
+
+ if not b:
+ return None
+ else:
+ assert type(b) == bytes().__class__
+ print(b)
+
+ if 100 <= b[0] <= 104:
+ return parse_const(b[0]), b[1:]
+ elif b[0] == 0xf:
+ return parse_pair(b[1:])
+ else:
+ return b, bytes()
+
return None
+def parse(b):
+ return _parse(b)[0]
+
class ViewState(object):