blob: 5b4f4d85d81371abb0df8571f143eab866ecc275 [file] [log] [blame]
Mark Slee89e2bb82007-03-01 00:20:36 +00001#
David Reissea2cba82009-03-30 21:35:00 +00002# Licensed to the Apache Software Foundation (ASF) under one
3# or more contributor license agreements. See the NOTICE file
4# distributed with this work for additional information
5# regarding copyright ownership. The ASF licenses this file
6# to you under the Apache License, Version 2.0 (the
7# "License"); you may not use this file except in compliance
8# with the License. You may obtain a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing,
13# software distributed under the License is distributed on an
14# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15# KIND, either express or implied. See the License for the
16# specific language governing permissions and limitations
17# under the License.
18#
Mark Slee89e2bb82007-03-01 00:20:36 +000019
Nobuaki Sukegawae841b3d2015-11-17 11:01:17 +090020from thrift.Thrift import TException, TType, TFrozenDict
Nobuaki Sukegawa7b545b52016-01-11 13:46:04 +090021from thrift.transport.TTransport import TTransportException
Mark Sleecde2b612006-09-03 21:13:07 +000022
Nobuaki Sukegawa299255a2016-01-06 14:52:50 +090023import sys
24from itertools import islice
Nobuaki Sukegawa299255a2016-01-06 14:52:50 +090025
Mark Slee92195ae2007-02-21 05:16:30 +000026
Bryan Duxbury69720412012-01-03 17:32:30 +000027class TProtocolException(TException):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090028 """Custom Protocol Exception class"""
Mark Slee92195ae2007-02-21 05:16:30 +000029
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090030 UNKNOWN = 0
31 INVALID_DATA = 1
32 NEGATIVE_SIZE = 2
33 SIZE_LIMIT = 3
34 BAD_VERSION = 4
35 NOT_IMPLEMENTED = 5
36 DEPTH_LIMIT = 6
Neil Williams66a44c52018-08-13 16:12:24 -070037 INVALID_PROTOCOL = 7
Mark Slee92195ae2007-02-21 05:16:30 +000038
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090039 def __init__(self, type=UNKNOWN, message=None):
40 TException.__init__(self, message)
41 self.type = type
Mark Slee92195ae2007-02-21 05:16:30 +000042
Mark Sleecde2b612006-09-03 21:13:07 +000043
Nobuaki Sukegawab9c859a2015-12-21 01:10:25 +090044class TProtocolBase(object):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090045 """Base class for Thrift protocol driver."""
Mark Sleecde2b612006-09-03 21:13:07 +000046
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090047 def __init__(self, trans):
48 self.trans = trans
Nobuaki Sukegawa6525f6a2016-02-11 13:58:39 +090049 self._fast_decode = None
50 self._fast_encode = None
Mark Slee4ac459f2006-10-25 21:39:01 +000051
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090052 @staticmethod
53 def _check_length(limit, length):
54 if length < 0:
55 raise TTransportException(TTransportException.NEGATIVE_SIZE,
56 'Negative length: %d' % length)
57 if limit is not None and length > limit:
58 raise TTransportException(TTransportException.SIZE_LIMIT,
59 'Length exceeded max allowed: %d' % limit)
Nobuaki Sukegawa7b545b52016-01-11 13:46:04 +090060
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090061 def writeMessageBegin(self, name, ttype, seqid):
62 pass
Mark Sleecde2b612006-09-03 21:13:07 +000063
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090064 def writeMessageEnd(self):
65 pass
Mark Sleecde2b612006-09-03 21:13:07 +000066
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090067 def writeStructBegin(self, name):
68 pass
Mark Sleecde2b612006-09-03 21:13:07 +000069
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090070 def writeStructEnd(self):
71 pass
Mark Sleecde2b612006-09-03 21:13:07 +000072
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090073 def writeFieldBegin(self, name, ttype, fid):
74 pass
Mark Sleecde2b612006-09-03 21:13:07 +000075
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090076 def writeFieldEnd(self):
77 pass
Mark Sleecde2b612006-09-03 21:13:07 +000078
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090079 def writeFieldStop(self):
80 pass
Mark Sleecde2b612006-09-03 21:13:07 +000081
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090082 def writeMapBegin(self, ktype, vtype, size):
83 pass
Mark Sleecde2b612006-09-03 21:13:07 +000084
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090085 def writeMapEnd(self):
86 pass
Mark Sleecde2b612006-09-03 21:13:07 +000087
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090088 def writeListBegin(self, etype, size):
89 pass
Mark Sleecde2b612006-09-03 21:13:07 +000090
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090091 def writeListEnd(self):
92 pass
Mark Sleecde2b612006-09-03 21:13:07 +000093
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090094 def writeSetBegin(self, etype, size):
95 pass
Mark Sleecde2b612006-09-03 21:13:07 +000096
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090097 def writeSetEnd(self):
98 pass
Mark Sleecde2b612006-09-03 21:13:07 +000099
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900100 def writeBool(self, bool_val):
101 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000102
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900103 def writeByte(self, byte):
104 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000105
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900106 def writeI16(self, i16):
107 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000108
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900109 def writeI32(self, i32):
110 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000111
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900112 def writeI64(self, i64):
113 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000114
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900115 def writeDouble(self, dub):
116 pass
Mark Sleec98d0502006-09-06 02:42:25 +0000117
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900118 def writeString(self, str_val):
Alexandre Detiste3494e1c2025-02-19 21:53:40 +0100119 self.writeBinary(bytes(str_val, 'utf-8'))
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900120
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900121 def writeBinary(self, str_val):
122 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000123
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900124 def readMessageBegin(self):
125 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000126
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900127 def readMessageEnd(self):
128 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000129
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900130 def readStructBegin(self):
131 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000132
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900133 def readStructEnd(self):
134 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000135
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900136 def readFieldBegin(self):
137 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000138
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900139 def readFieldEnd(self):
140 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000141
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900142 def readMapBegin(self):
143 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000144
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900145 def readMapEnd(self):
146 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000147
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900148 def readListBegin(self):
149 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000150
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900151 def readListEnd(self):
152 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000153
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900154 def readSetBegin(self):
155 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000156
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900157 def readSetEnd(self):
158 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000159
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900160 def readBool(self):
161 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000162
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900163 def readByte(self):
164 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000165
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900166 def readI16(self):
167 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000168
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900169 def readI32(self):
170 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000171
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900172 def readI64(self):
173 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000174
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900175 def readDouble(self):
176 pass
Mark Sleec98d0502006-09-06 02:42:25 +0000177
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900178 def readString(self):
Alexandre Detiste3494e1c2025-02-19 21:53:40 +0100179 return self.readBinary().decode('utf-8')
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900180
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900181 def readBinary(self):
182 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000183
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900184 def skip(self, ttype):
James E. King IIIdbc1f8d2019-02-14 16:46:38 -0500185 if ttype == TType.BOOL:
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900186 self.readBool()
187 elif ttype == TType.BYTE:
188 self.readByte()
189 elif ttype == TType.I16:
190 self.readI16()
191 elif ttype == TType.I32:
192 self.readI32()
193 elif ttype == TType.I64:
194 self.readI64()
195 elif ttype == TType.DOUBLE:
196 self.readDouble()
197 elif ttype == TType.STRING:
198 self.readString()
199 elif ttype == TType.STRUCT:
200 name = self.readStructBegin()
201 while True:
202 (name, ttype, id) = self.readFieldBegin()
203 if ttype == TType.STOP:
204 break
205 self.skip(ttype)
206 self.readFieldEnd()
207 self.readStructEnd()
208 elif ttype == TType.MAP:
209 (ktype, vtype, size) = self.readMapBegin()
210 for i in range(size):
211 self.skip(ktype)
212 self.skip(vtype)
213 self.readMapEnd()
214 elif ttype == TType.SET:
215 (etype, size) = self.readSetBegin()
216 for i in range(size):
217 self.skip(etype)
218 self.readSetEnd()
219 elif ttype == TType.LIST:
220 (etype, size) = self.readListBegin()
221 for i in range(size):
222 self.skip(etype)
223 self.readListEnd()
James E. King IIIdbc1f8d2019-02-14 16:46:38 -0500224 else:
225 raise TProtocolException(
226 TProtocolException.INVALID_DATA,
227 "invalid TType")
Mark Sleecde2b612006-09-03 21:13:07 +0000228
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900229 # tuple of: ( 'reader method' name, is_container bool, 'writer_method' name )
230 _TTYPE_HANDLERS = (
231 (None, None, False), # 0 TType.STOP
232 (None, None, False), # 1 TType.VOID # TODO: handle void?
233 ('readBool', 'writeBool', False), # 2 TType.BOOL
234 ('readByte', 'writeByte', False), # 3 TType.BYTE and I08
235 ('readDouble', 'writeDouble', False), # 4 TType.DOUBLE
236 (None, None, False), # 5 undefined
237 ('readI16', 'writeI16', False), # 6 TType.I16
238 (None, None, False), # 7 undefined
239 ('readI32', 'writeI32', False), # 8 TType.I32
240 (None, None, False), # 9 undefined
241 ('readI64', 'writeI64', False), # 10 TType.I64
242 ('readString', 'writeString', False), # 11 TType.STRING and UTF7
243 ('readContainerStruct', 'writeContainerStruct', True), # 12 *.STRUCT
244 ('readContainerMap', 'writeContainerMap', True), # 13 TType.MAP
245 ('readContainerSet', 'writeContainerSet', True), # 14 TType.SET
246 ('readContainerList', 'writeContainerList', True), # 15 TType.LIST
247 (None, None, False), # 16 TType.UTF8 # TODO: handle utf8 types?
248 (None, None, False) # 17 TType.UTF16 # TODO: handle utf16 types?
249 )
Roger Meierf4eec7a2011-09-11 18:16:21 +0000250
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900251 def _ttype_handlers(self, ttype, spec):
252 if spec == 'BINARY':
253 if ttype != TType.STRING:
254 raise TProtocolException(type=TProtocolException.INVALID_DATA,
255 message='Invalid binary field type %d' % ttype)
256 return ('readBinary', 'writeBinary', False)
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900257 return self._TTYPE_HANDLERS[ttype] if ttype < len(self._TTYPE_HANDLERS) else (None, None, False)
Nobuaki Sukegawa299255a2016-01-06 14:52:50 +0900258
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900259 def _read_by_ttype(self, ttype, spec, espec):
Elvis Pranskevichus2d1fe882017-05-23 11:36:23 -0400260 reader_name, _, is_container = self._ttype_handlers(ttype, espec)
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900261 if reader_name is None:
262 raise TProtocolException(type=TProtocolException.INVALID_DATA,
263 message='Invalid type %d' % (ttype))
264 reader_func = getattr(self, reader_name)
265 read = (lambda: reader_func(espec)) if is_container else reader_func
266 while True:
267 yield read()
Nobuaki Sukegawabc7e4802015-11-14 19:23:27 +0900268
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900269 def readFieldByTType(self, ttype, spec):
Nobuaki Sukegawa6525f6a2016-02-11 13:58:39 +0900270 return next(self._read_by_ttype(ttype, spec, spec))
Roger Meierf4eec7a2011-09-11 18:16:21 +0000271
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900272 def readContainerList(self, spec):
273 ttype, tspec, is_immutable = spec
274 (list_type, list_len) = self.readListBegin()
275 # TODO: compare types we just decoded with thrift_spec
276 elems = islice(self._read_by_ttype(ttype, spec, tspec), list_len)
277 results = (tuple if is_immutable else list)(elems)
278 self.readListEnd()
279 return results
Roger Meierf4eec7a2011-09-11 18:16:21 +0000280
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900281 def readContainerSet(self, spec):
282 ttype, tspec, is_immutable = spec
283 (set_type, set_len) = self.readSetBegin()
284 # TODO: compare types we just decoded with thrift_spec
285 elems = islice(self._read_by_ttype(ttype, spec, tspec), set_len)
286 results = (frozenset if is_immutable else set)(elems)
287 self.readSetEnd()
288 return results
Roger Meierf4eec7a2011-09-11 18:16:21 +0000289
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900290 def readContainerStruct(self, spec):
291 (obj_class, obj_spec) = spec
Elvis Pranskevichus9c439622019-12-11 16:47:52 -0500292
293 # If obj_class.read is a classmethod (e.g. in frozen structs),
294 # call it as such.
295 if getattr(obj_class.read, '__self__', None) is obj_class:
296 obj = obj_class.read(self)
297 else:
298 obj = obj_class()
299 obj.read(self)
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900300 return obj
Bryan Duxbury69720412012-01-03 17:32:30 +0000301
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900302 def readContainerMap(self, spec):
303 ktype, kspec, vtype, vspec, is_immutable = spec
304 (map_ktype, map_vtype, map_len) = self.readMapBegin()
305 # TODO: compare types we just decoded with thrift_spec and
306 # abort/skip if types disagree
307 keys = self._read_by_ttype(ktype, spec, kspec)
308 vals = self._read_by_ttype(vtype, spec, vspec)
309 keyvals = islice(zip(keys, vals), map_len)
310 results = (TFrozenDict if is_immutable else dict)(keyvals)
311 self.readMapEnd()
312 return results
Roger Meierf4eec7a2011-09-11 18:16:21 +0000313
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900314 def readStruct(self, obj, thrift_spec, is_immutable=False):
315 if is_immutable:
316 fields = {}
317 self.readStructBegin()
318 while True:
319 (fname, ftype, fid) = self.readFieldBegin()
320 if ftype == TType.STOP:
321 break
322 try:
323 field = thrift_spec[fid]
324 except IndexError:
325 self.skip(ftype)
326 else:
327 if field is not None and ftype == field[1]:
328 fname = field[2]
329 fspec = field[3]
330 val = self.readFieldByTType(ftype, fspec)
331 if is_immutable:
332 fields[fname] = val
333 else:
334 setattr(obj, fname, val)
335 else:
336 self.skip(ftype)
337 self.readFieldEnd()
338 self.readStructEnd()
339 if is_immutable:
340 return obj(**fields)
Roger Meierf4eec7a2011-09-11 18:16:21 +0000341
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900342 def writeContainerStruct(self, val, spec):
343 val.write(self)
Roger Meierf4eec7a2011-09-11 18:16:21 +0000344
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900345 def writeContainerList(self, val, spec):
346 ttype, tspec, _ = spec
347 self.writeListBegin(ttype, len(val))
348 for _ in self._write_by_ttype(ttype, val, spec, tspec):
349 pass
350 self.writeListEnd()
Roger Meierf4eec7a2011-09-11 18:16:21 +0000351
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900352 def writeContainerSet(self, val, spec):
353 ttype, tspec, _ = spec
354 self.writeSetBegin(ttype, len(val))
355 for _ in self._write_by_ttype(ttype, val, spec, tspec):
356 pass
357 self.writeSetEnd()
Roger Meierf4eec7a2011-09-11 18:16:21 +0000358
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900359 def writeContainerMap(self, val, spec):
360 ktype, kspec, vtype, vspec, _ = spec
361 self.writeMapBegin(ktype, vtype, len(val))
Alexandre Detiste8f9fba82024-08-28 14:28:39 +0200362 for _ in zip(self._write_by_ttype(ktype, val.keys(), spec, kspec),
363 self._write_by_ttype(vtype, val.values(), spec, vspec)):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900364 pass
365 self.writeMapEnd()
Roger Meierf4eec7a2011-09-11 18:16:21 +0000366
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900367 def writeStruct(self, obj, thrift_spec):
368 self.writeStructBegin(obj.__class__.__name__)
369 for field in thrift_spec:
370 if field is None:
371 continue
372 fname = field[2]
373 val = getattr(obj, fname)
374 if val is None:
375 # skip writing out unset fields
376 continue
377 fid = field[0]
378 ftype = field[1]
379 fspec = field[3]
380 self.writeFieldBegin(fname, ftype, fid)
381 self.writeFieldByTType(ftype, val, fspec)
382 self.writeFieldEnd()
383 self.writeFieldStop()
384 self.writeStructEnd()
Roger Meierf4eec7a2011-09-11 18:16:21 +0000385
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900386 def _write_by_ttype(self, ttype, vals, spec, espec):
Elvis Pranskevichus2d1fe882017-05-23 11:36:23 -0400387 _, writer_name, is_container = self._ttype_handlers(ttype, espec)
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900388 writer_func = getattr(self, writer_name)
389 write = (lambda v: writer_func(v, espec)) if is_container else writer_func
390 for v in vals:
391 yield write(v)
Nobuaki Sukegawa299255a2016-01-06 14:52:50 +0900392
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900393 def writeFieldByTType(self, ttype, val, spec):
Nobuaki Sukegawa6525f6a2016-02-11 13:58:39 +0900394 next(self._write_by_ttype(ttype, [val], spec, spec))
Roger Meierf4eec7a2011-09-11 18:16:21 +0000395
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900396
Konrad Grochowski93fea152014-10-02 16:29:14 +0200397def checkIntegerLimits(i, bits):
Konrad Grochowski07218672014-10-09 12:18:25 +0200398 if bits == 8 and (i < -128 or i > 127):
Konrad Grochowski93fea152014-10-02 16:29:14 +0200399 raise TProtocolException(TProtocolException.INVALID_DATA,
Konrad Grochowskid5f3be52014-10-08 15:32:21 +0200400 "i8 requires -128 <= number <= 127")
Konrad Grochowski07218672014-10-09 12:18:25 +0200401 elif bits == 16 and (i < -32768 or i > 32767):
Konrad Grochowskid5f3be52014-10-08 15:32:21 +0200402 raise TProtocolException(TProtocolException.INVALID_DATA,
403 "i16 requires -32768 <= number <= 32767")
Konrad Grochowski07218672014-10-09 12:18:25 +0200404 elif bits == 32 and (i < -2147483648 or i > 2147483647):
Konrad Grochowskid5f3be52014-10-08 15:32:21 +0200405 raise TProtocolException(TProtocolException.INVALID_DATA,
406 "i32 requires -2147483648 <= number <= 2147483647")
Konrad Grochowski07218672014-10-09 12:18:25 +0200407 elif bits == 64 and (i < -9223372036854775808 or i > 9223372036854775807):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900408 raise TProtocolException(TProtocolException.INVALID_DATA,
409 "i64 requires -9223372036854775808 <= number <= 9223372036854775807")
Bryan Duxbury69720412012-01-03 17:32:30 +0000410
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900411
Nobuaki Sukegawab9c859a2015-12-21 01:10:25 +0900412class TProtocolFactory(object):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900413 def getProtocol(self, trans):
414 pass