diff options
| -rw-r--r-- | tests/test_core.py | 17 | ||||
| -rw-r--r-- | viewstate/__main__.py | 2 | ||||
| -rw-r--r-- | viewstate/core.py | 27 |
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): |
