Skip to content
This repository was archived by the owner on Dec 10, 2018. It is now read-only.

Commit 76617ef

Browse files
committed
Merge pull request #43 from maralla/skip
use skip instead of raising exception
2 parents 0722124 + 038777a commit 76617ef

File tree

2 files changed

+103
-1
lines changed

2 files changed

+103
-1
lines changed

tests/test_protocol_cybinary.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,3 +244,68 @@ class Hello(TPayload):
244244

245245
item2 = Hello()
246246
p.read_struct(item2)
247+
248+
249+
def test_skip_bool():
250+
b = TCyBufferedTransport(TMemoryBuffer())
251+
proto.write_val(b, TType.BOOL, 1)
252+
proto.write_val(b, TType.I32, 123)
253+
b.flush()
254+
255+
proto.skip(b, TType.BOOL)
256+
assert 123 == proto.read_val(b, TType.I32)
257+
258+
259+
def test_skip_double():
260+
b = TCyBufferedTransport(TMemoryBuffer())
261+
proto.write_val(b, TType.DOUBLE, 0.123425897)
262+
proto.write_val(b, TType.I32, 123)
263+
b.flush()
264+
265+
proto.skip(b, TType.DOUBLE)
266+
assert 123 == proto.read_val(b, TType.I32)
267+
268+
269+
def test_skip_string():
270+
b = TCyBufferedTransport(TMemoryBuffer())
271+
proto.write_val(b, TType.STRING, "hello world")
272+
proto.write_val(b, TType.I32, 123)
273+
b.flush()
274+
275+
proto.skip(b, TType.STRING)
276+
assert 123 == proto.read_val(b, TType.I32)
277+
278+
279+
def test_skip_list():
280+
b = TCyBufferedTransport(TMemoryBuffer())
281+
proto.write_val(b, TType.LIST, [5, 6, 7, 8, 9], spec=TType.I32)
282+
proto.write_val(b, TType.I32, 123)
283+
b.flush()
284+
285+
proto.skip(b, TType.LIST)
286+
assert 123 == proto.read_val(b, TType.I32)
287+
288+
289+
def test_skip_map():
290+
b = TCyBufferedTransport(TMemoryBuffer())
291+
proto.write_val(b, TType.MAP, {"hello": 0.3456},
292+
spec=(TType.STRING, TType.DOUBLE))
293+
proto.write_val(b, TType.I32, 123)
294+
b.flush()
295+
296+
proto.skip(b, TType.MAP)
297+
assert 123 == proto.read_val(b, TType.I32)
298+
299+
300+
def test_skip_struct():
301+
b = TCyBufferedTransport(TMemoryBuffer())
302+
p = proto.TCyBinaryProtocol(b)
303+
item = TItem(id=123, phones=["123456", "abcdef"])
304+
p.write_struct(item)
305+
p.write_message_end()
306+
307+
proto.write_val(b, TType.I32, 123)
308+
b.flush()
309+
310+
proto.skip(b, TType.STRUCT)
311+
assert 123 == proto.read_val(b, TType.I32)

thriftpy/protocol/cybin/cybin.pyx

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ cdef inline read_struct(TCyBufferedTransport buf, obj):
110110

111111
fid = read_i16(buf)
112112
if fid not in field_specs:
113-
raise ProtocolError("skip")
113+
skip(buf, field_type)
114+
continue
114115

115116
field_spec = field_specs[fid]
116117
ttype = field_spec[0]
@@ -326,6 +327,42 @@ cdef c_write_val(TCyBufferedTransport buf, TType ttype, val, spec=None):
326327
write_struct(buf, val)
327328

328329

330+
cpdef skip(TCyBufferedTransport buf, TType ttype):
331+
cdef TType v_type, k_type, f_type
332+
cdef int i, size
333+
334+
if ttype == T_BOOL or ttype == T_I08:
335+
read_i08(buf)
336+
elif ttype == T_I16:
337+
read_i16(buf)
338+
elif ttype == T_I32:
339+
read_i32(buf)
340+
elif ttype == T_I64 or ttype == T_DOUBLE:
341+
read_i64(buf)
342+
elif ttype == T_STRING:
343+
size = read_i32(buf)
344+
c_read_string(buf, size)
345+
elif ttype == T_SET or ttype == T_LIST:
346+
v_type = <TType>read_i08(buf)
347+
size = read_i32(buf)
348+
for i in range(size):
349+
skip(buf, v_type)
350+
elif ttype == T_MAP:
351+
k_type = <TType>read_i08(buf)
352+
v_type = <TType>read_i08(buf)
353+
size = read_i32(buf)
354+
for i in range(size):
355+
skip(buf, k_type)
356+
skip(buf, v_type)
357+
elif ttype == T_STRUCT:
358+
while 1:
359+
f_type = <TType>read_i08(buf)
360+
if f_type == T_STOP:
361+
break
362+
read_i16(buf)
363+
skip(buf, f_type)
364+
365+
329366
def read_val(TCyBufferedTransport buf, TType ttype):
330367
return c_read_val(buf, ttype)
331368

0 commit comments

Comments
 (0)