Skip to content

Commit d2f549a

Browse files
committed
fallback: add actual rollback and add a testcase for it
Signed-off-by: Bas Westerbaan <bas@westerbaan.name>
1 parent fb81f80 commit d2f549a

File tree

2 files changed

+28
-8
lines changed

2 files changed

+28
-8
lines changed

msgpack/fallback.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -208,17 +208,13 @@ def _fb_got_extradata(self):
208208
def __iter__(self):
209209
return self
210210

211-
def next(self):
212-
try:
213-
ret = self._fb_unpack(EX_CONSTRUCT, None)
214-
self._fb_consume()
215-
return ret
216-
except OutOfData:
217-
raise StopIteration
218-
219211
def read_bytes(self, n):
220212
return self._fb_read(n)
221213

214+
def _fb_rollback(self):
215+
self._fb_buf_i = 0
216+
self._fb_buf_o = 0
217+
222218
def _fb_get_extradata(self):
223219
bufs = self._fb_buffers[self._fb_buf_i:]
224220
if bufs:
@@ -244,6 +240,7 @@ def _fb_read(self, n, write_bytes=None):
244240
self._fb_buf_o = 0
245241
self._fb_buf_i += 1
246242
if len(ret) != n:
243+
self._fb_rollback()
247244
raise OutOfData
248245
if write_bytes is not None:
249246
write_bytes(ret)
@@ -363,6 +360,14 @@ def _fb_unpack(self, execute=EX_CONSTRUCT, write_bytes=None):
363360
assert typ == TYPE_IMMEDIATE
364361
return obj
365362

363+
def next(self):
364+
try:
365+
ret = self._fb_unpack(EX_CONSTRUCT, None)
366+
self._fb_consume()
367+
return ret
368+
except OutOfData:
369+
raise StopIteration
370+
366371
def skip(self, write_bytes=None):
367372
self._fb_unpack(EX_SKIP, write_bytes)
368373
self._fb_consume()

test/test_sequnpack.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,21 @@
77
from pytest import raises
88

99

10+
def test_partialdata():
11+
unpacker = Unpacker()
12+
unpacker.feed(b'\xa5')
13+
with raises(StopIteration): next(iter(unpacker))
14+
unpacker.feed(b'h')
15+
with raises(StopIteration): next(iter(unpacker))
16+
unpacker.feed(b'a')
17+
with raises(StopIteration): next(iter(unpacker))
18+
unpacker.feed(b'l')
19+
with raises(StopIteration): next(iter(unpacker))
20+
unpacker.feed(b'l')
21+
with raises(StopIteration): next(iter(unpacker))
22+
unpacker.feed(b'o')
23+
assert next(iter(unpacker)) == 'hallo'
24+
1025
def test_foobar():
1126
unpacker = Unpacker(read_size=3, use_list=1)
1227
unpacker.feed(b'foobar')

0 commit comments

Comments
 (0)