blob: a0d145266d277510e0fd38aff0362eaa228633e8 [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 +090023from itertools import islice
Nobuaki Sukegawa299255a2016-01-06 14:52:50 +090024
Mark Slee92195ae2007-02-21 05:16:30 +000025
Bryan Duxbury69720412012-01-03 17:32:30 +000026class TProtocolException(TException):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090027 """Custom Protocol Exception class"""
Mark Slee92195ae2007-02-21 05:16:30 +000028
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090029 UNKNOWN = 0
30 INVALID_DATA = 1
31 NEGATIVE_SIZE = 2
32 SIZE_LIMIT = 3
33 BAD_VERSION = 4
34 NOT_IMPLEMENTED = 5
35 DEPTH_LIMIT = 6
Neil Williams66a44c52018-08-13 16:12:24 -070036 INVALID_PROTOCOL = 7
Mark Slee92195ae2007-02-21 05:16:30 +000037
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090038 def __init__(self, type=UNKNOWN, message=None):
39 TException.__init__(self, message)
40 self.type = type
Mark Slee92195ae2007-02-21 05:16:30 +000041
Mark Sleecde2b612006-09-03 21:13:07 +000042
Nobuaki Sukegawab9c859a2015-12-21 01:10:25 +090043class TProtocolBase(object):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090044 """Base class for Thrift protocol driver."""
Mark Sleecde2b612006-09-03 21:13:07 +000045
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090046 def __init__(self, trans):
47 self.trans = trans
Nobuaki Sukegawa6525f6a2016-02-11 13:58:39 +090048 self._fast_decode = None
49 self._fast_encode = None
Mark Slee4ac459f2006-10-25 21:39:01 +000050
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090051 @staticmethod
52 def _check_length(limit, length):
53 if length < 0:
54 raise TTransportException(TTransportException.NEGATIVE_SIZE,
55 'Negative length: %d' % length)
56 if limit is not None and length > limit:
57 raise TTransportException(TTransportException.SIZE_LIMIT,
58 'Length exceeded max allowed: %d' % limit)
Nobuaki Sukegawa7b545b52016-01-11 13:46:04 +090059
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090060 def writeMessageBegin(self, name, ttype, seqid):
61 pass
Mark Sleecde2b612006-09-03 21:13:07 +000062
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090063 def writeMessageEnd(self):
64 pass
Mark Sleecde2b612006-09-03 21:13:07 +000065
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090066 def writeStructBegin(self, name):
67 pass
Mark Sleecde2b612006-09-03 21:13:07 +000068
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090069 def writeStructEnd(self):
70 pass
Mark Sleecde2b612006-09-03 21:13:07 +000071
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090072 def writeFieldBegin(self, name, ttype, fid):
73 pass
Mark Sleecde2b612006-09-03 21:13:07 +000074
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090075 def writeFieldEnd(self):
76 pass
Mark Sleecde2b612006-09-03 21:13:07 +000077
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090078 def writeFieldStop(self):
79 pass
Mark Sleecde2b612006-09-03 21:13:07 +000080
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090081 def writeMapBegin(self, ktype, vtype, size):
82 pass
Mark Sleecde2b612006-09-03 21:13:07 +000083
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090084 def writeMapEnd(self):
85 pass
Mark Sleecde2b612006-09-03 21:13:07 +000086
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090087 def writeListBegin(self, etype, size):
88 pass
Mark Sleecde2b612006-09-03 21:13:07 +000089
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090090 def writeListEnd(self):
91 pass
Mark Sleecde2b612006-09-03 21:13:07 +000092
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090093 def writeSetBegin(self, etype, size):
94 pass
Mark Sleecde2b612006-09-03 21:13:07 +000095
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090096 def writeSetEnd(self):
97 pass
Mark Sleecde2b612006-09-03 21:13:07 +000098
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090099 def writeBool(self, bool_val):
100 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000101
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900102 def writeByte(self, byte):
103 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000104
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900105 def writeI16(self, i16):
106 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000107
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900108 def writeI32(self, i32):
109 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000110
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900111 def writeI64(self, i64):
112 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000113
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900114 def writeDouble(self, dub):
115 pass
Mark Sleec98d0502006-09-06 02:42:25 +0000116
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900117 def writeString(self, str_val):
Alexandre Detiste3494e1c2025-02-19 21:53:40 +0100118 self.writeBinary(bytes(str_val, 'utf-8'))
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900119
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900120 def writeBinary(self, str_val):
121 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000122
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900123 def readMessageBegin(self):
124 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000125
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900126 def readMessageEnd(self):
127 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000128
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900129 def readStructBegin(self):
130 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000131
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900132 def readStructEnd(self):
133 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000134
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900135 def readFieldBegin(self):
136 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000137
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900138 def readFieldEnd(self):
139 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000140
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900141 def readMapBegin(self):
142 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000143
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900144 def readMapEnd(self):
145 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000146
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900147 def readListBegin(self):
148 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000149
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900150 def readListEnd(self):
151 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000152
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900153 def readSetBegin(self):
154 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000155
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900156 def readSetEnd(self):
157 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000158
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900159 def readBool(self):
160 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000161
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900162 def readByte(self):
163 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000164
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900165 def readI16(self):
166 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000167
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900168 def readI32(self):
169 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000170
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900171 def readI64(self):
172 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000173
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900174 def readDouble(self):
175 pass
Mark Sleec98d0502006-09-06 02:42:25 +0000176
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900177 def readString(self):
Alexandre Detiste3494e1c2025-02-19 21:53:40 +0100178 return self.readBinary().decode('utf-8')
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900179
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900180 def readBinary(self):
181 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000182
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900183 def skip(self, ttype):
James E. King IIIdbc1f8d2019-02-14 16:46:38 -0500184 if ttype == TType.BOOL:
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900185 self.readBool()
186 elif ttype == TType.BYTE:
187 self.readByte()
188 elif ttype == TType.I16:
189 self.readI16()
190 elif ttype == TType.I32:
191 self.readI32()
192 elif ttype == TType.I64:
193 self.readI64()
194 elif ttype == TType.DOUBLE:
195 self.readDouble()
196 elif ttype == TType.STRING:
197 self.readString()
198 elif ttype == TType.STRUCT:
199 name = self.readStructBegin()
200 while True:
201 (name, ttype, id) = self.readFieldBegin()
202 if ttype == TType.STOP:
203 break
204 self.skip(ttype)
205 self.readFieldEnd()
206 self.readStructEnd()
207 elif ttype == TType.MAP:
208 (ktype, vtype, size) = self.readMapBegin()
209 for i in range(size):
210 self.skip(ktype)
211 self.skip(vtype)
212 self.readMapEnd()
213 elif ttype == TType.SET:
214 (etype, size) = self.readSetBegin()
215 for i in range(size):
216 self.skip(etype)
217 self.readSetEnd()
218 elif ttype == TType.LIST:
219 (etype, size) = self.readListBegin()
220 for i in range(size):
221 self.skip(etype)
222 self.readListEnd()
James E. King IIIdbc1f8d2019-02-14 16:46:38 -0500223 else:
224 raise TProtocolException(
225 TProtocolException.INVALID_DATA,
226 "invalid TType")
Mark Sleecde2b612006-09-03 21:13:07 +0000227
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900228 # tuple of: ( 'reader method' name, is_container bool, 'writer_method' name )
229 _TTYPE_HANDLERS = (
230 (None, None, False), # 0 TType.STOP
231 (None, None, False), # 1 TType.VOID # TODO: handle void?
232 ('readBool', 'writeBool', False), # 2 TType.BOOL
233 ('readByte', 'writeByte', False), # 3 TType.BYTE and I08
234 ('readDouble', 'writeDouble', False), # 4 TType.DOUBLE
235 (None, None, False), # 5 undefined
236 ('readI16', 'writeI16', False), # 6 TType.I16
237 (None, None, False), # 7 undefined
238 ('readI32', 'writeI32', False), # 8 TType.I32
239 (None, None, False), # 9 undefined
240 ('readI64', 'writeI64', False), # 10 TType.I64
241 ('readString', 'writeString', False), # 11 TType.STRING and UTF7
242 ('readContainerStruct', 'writeContainerStruct', True), # 12 *.STRUCT
243 ('readContainerMap', 'writeContainerMap', True), # 13 TType.MAP
244 ('readContainerSet', 'writeContainerSet', True), # 14 TType.SET
245 ('readContainerList', 'writeContainerList', True), # 15 TType.LIST
246 (None, None, False), # 16 TType.UTF8 # TODO: handle utf8 types?
247 (None, None, False) # 17 TType.UTF16 # TODO: handle utf16 types?
248 )
Roger Meierf4eec7a2011-09-11 18:16:21 +0000249
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900250 def _ttype_handlers(self, ttype, spec):
251 if spec == 'BINARY':
252 if ttype != TType.STRING:
253 raise TProtocolException(type=TProtocolException.INVALID_DATA,
254 message='Invalid binary field type %d' % ttype)
255 return ('readBinary', 'writeBinary', False)
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900256 return self._TTYPE_HANDLERS[ttype] if ttype < len(self._TTYPE_HANDLERS) else (None, None, False)
Nobuaki Sukegawa299255a2016-01-06 14:52:50 +0900257
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900258 def _read_by_ttype(self, ttype, spec, espec):
Elvis Pranskevichus2d1fe882017-05-23 11:36:23 -0400259 reader_name, _, is_container = self._ttype_handlers(ttype, espec)
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900260 if reader_name is None:
261 raise TProtocolException(type=TProtocolException.INVALID_DATA,
262 message='Invalid type %d' % (ttype))
263 reader_func = getattr(self, reader_name)
264 read = (lambda: reader_func(espec)) if is_container else reader_func
265 while True:
266 yield read()
Nobuaki Sukegawabc7e4802015-11-14 19:23:27 +0900267
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900268 def readFieldByTType(self, ttype, spec):
Nobuaki Sukegawa6525f6a2016-02-11 13:58:39 +0900269 return next(self._read_by_ttype(ttype, spec, spec))
Roger Meierf4eec7a2011-09-11 18:16:21 +0000270
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900271 def readContainerList(self, spec):
272 ttype, tspec, is_immutable = spec
273 (list_type, list_len) = self.readListBegin()
274 # TODO: compare types we just decoded with thrift_spec
275 elems = islice(self._read_by_ttype(ttype, spec, tspec), list_len)
276 results = (tuple if is_immutable else list)(elems)
277 self.readListEnd()
278 return results
Roger Meierf4eec7a2011-09-11 18:16:21 +0000279
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900280 def readContainerSet(self, spec):
281 ttype, tspec, is_immutable = spec
282 (set_type, set_len) = self.readSetBegin()
283 # TODO: compare types we just decoded with thrift_spec
284 elems = islice(self._read_by_ttype(ttype, spec, tspec), set_len)
285 results = (frozenset if is_immutable else set)(elems)
286 self.readSetEnd()
287 return results
Roger Meierf4eec7a2011-09-11 18:16:21 +0000288
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900289 def readContainerStruct(self, spec):
290 (obj_class, obj_spec) = spec
Elvis Pranskevichus9c439622019-12-11 16:47:52 -0500291
292 # If obj_class.read is a classmethod (e.g. in frozen structs),
293 # call it as such.
294 if getattr(obj_class.read, '__self__', None) is obj_class:
295 obj = obj_class.read(self)
296 else:
297 obj = obj_class()
298 obj.read(self)
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900299 return obj
Bryan Duxbury69720412012-01-03 17:32:30 +0000300
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900301 def readContainerMap(self, spec):
302 ktype, kspec, vtype, vspec, is_immutable = spec
303 (map_ktype, map_vtype, map_len) = self.readMapBegin()
304 # TODO: compare types we just decoded with thrift_spec and
305 # abort/skip if types disagree
306 keys = self._read_by_ttype(ktype, spec, kspec)
307 vals = self._read_by_ttype(vtype, spec, vspec)
308 keyvals = islice(zip(keys, vals), map_len)
309 results = (TFrozenDict if is_immutable else dict)(keyvals)
310 self.readMapEnd()
311 return results
Roger Meierf4eec7a2011-09-11 18:16:21 +0000312
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900313 def readStruct(self, obj, thrift_spec, is_immutable=False):
314 if is_immutable:
315 fields = {}
316 self.readStructBegin()
317 while True:
318 (fname, ftype, fid) = self.readFieldBegin()
319 if ftype == TType.STOP:
320 break
321 try:
322 field = thrift_spec[fid]
323 except IndexError:
324 self.skip(ftype)
325 else:
326 if field is not None and ftype == field[1]:
327 fname = field[2]
328 fspec = field[3]
329 val = self.readFieldByTType(ftype, fspec)
330 if is_immutable:
331 fields[fname] = val
332 else:
333 setattr(obj, fname, val)
334 else:
335 self.skip(ftype)
336 self.readFieldEnd()
337 self.readStructEnd()
338 if is_immutable:
339 return obj(**fields)
Roger Meierf4eec7a2011-09-11 18:16:21 +0000340
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900341 def writeContainerStruct(self, val, spec):
342 val.write(self)
Roger Meierf4eec7a2011-09-11 18:16:21 +0000343
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900344 def writeContainerList(self, val, spec):
345 ttype, tspec, _ = spec
346 self.writeListBegin(ttype, len(val))
347 for _ in self._write_by_ttype(ttype, val, spec, tspec):
348 pass
349 self.writeListEnd()
Roger Meierf4eec7a2011-09-11 18:16:21 +0000350
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900351 def writeContainerSet(self, val, spec):
352 ttype, tspec, _ = spec
353 self.writeSetBegin(ttype, len(val))
354 for _ in self._write_by_ttype(ttype, val, spec, tspec):
355 pass
356 self.writeSetEnd()
Roger Meierf4eec7a2011-09-11 18:16:21 +0000357
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900358 def writeContainerMap(self, val, spec):
359 ktype, kspec, vtype, vspec, _ = spec
360 self.writeMapBegin(ktype, vtype, len(val))
Alexandre Detiste8f9fba82024-08-28 14:28:39 +0200361 for _ in zip(self._write_by_ttype(ktype, val.keys(), spec, kspec),
362 self._write_by_ttype(vtype, val.values(), spec, vspec)):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900363 pass
364 self.writeMapEnd()
Roger Meierf4eec7a2011-09-11 18:16:21 +0000365
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900366 def writeStruct(self, obj, thrift_spec):
367 self.writeStructBegin(obj.__class__.__name__)
368 for field in thrift_spec:
369 if field is None:
370 continue
371 fname = field[2]
372 val = getattr(obj, fname)
373 if val is None:
374 # skip writing out unset fields
375 continue
376 fid = field[0]
377 ftype = field[1]
378 fspec = field[3]
379 self.writeFieldBegin(fname, ftype, fid)
380 self.writeFieldByTType(ftype, val, fspec)
381 self.writeFieldEnd()
382 self.writeFieldStop()
383 self.writeStructEnd()
Roger Meierf4eec7a2011-09-11 18:16:21 +0000384
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900385 def _write_by_ttype(self, ttype, vals, spec, espec):
Elvis Pranskevichus2d1fe882017-05-23 11:36:23 -0400386 _, writer_name, is_container = self._ttype_handlers(ttype, espec)
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900387 writer_func = getattr(self, writer_name)
388 write = (lambda v: writer_func(v, espec)) if is_container else writer_func
389 for v in vals:
390 yield write(v)
Nobuaki Sukegawa299255a2016-01-06 14:52:50 +0900391
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900392 def writeFieldByTType(self, ttype, val, spec):
Nobuaki Sukegawa6525f6a2016-02-11 13:58:39 +0900393 next(self._write_by_ttype(ttype, [val], spec, spec))
Roger Meierf4eec7a2011-09-11 18:16:21 +0000394
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900395
Konrad Grochowski93fea152014-10-02 16:29:14 +0200396def checkIntegerLimits(i, bits):
Konrad Grochowski07218672014-10-09 12:18:25 +0200397 if bits == 8 and (i < -128 or i > 127):
Konrad Grochowski93fea152014-10-02 16:29:14 +0200398 raise TProtocolException(TProtocolException.INVALID_DATA,
Konrad Grochowskid5f3be52014-10-08 15:32:21 +0200399 "i8 requires -128 <= number <= 127")
Konrad Grochowski07218672014-10-09 12:18:25 +0200400 elif bits == 16 and (i < -32768 or i > 32767):
Konrad Grochowskid5f3be52014-10-08 15:32:21 +0200401 raise TProtocolException(TProtocolException.INVALID_DATA,
402 "i16 requires -32768 <= number <= 32767")
Konrad Grochowski07218672014-10-09 12:18:25 +0200403 elif bits == 32 and (i < -2147483648 or i > 2147483647):
Konrad Grochowskid5f3be52014-10-08 15:32:21 +0200404 raise TProtocolException(TProtocolException.INVALID_DATA,
405 "i32 requires -2147483648 <= number <= 2147483647")
Konrad Grochowski07218672014-10-09 12:18:25 +0200406 elif bits == 64 and (i < -9223372036854775808 or i > 9223372036854775807):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900407 raise TProtocolException(TProtocolException.INVALID_DATA,
408 "i64 requires -9223372036854775808 <= number <= 9223372036854775807")
Bryan Duxbury69720412012-01-03 17:32:30 +0000409
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900410
Nobuaki Sukegawab9c859a2015-12-21 01:10:25 +0900411class TProtocolFactory(object):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900412 def getProtocol(self, trans):
413 pass