blob: ec71ab3aa72a355ed398c9aeedd7cd7b49962795 [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
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +090022from ..compat import binary_to_str, str_to_binary
Mark Sleecde2b612006-09-03 21:13:07 +000023
Nobuaki Sukegawa299255a2016-01-06 14:52:50 +090024import sys
25from itertools import islice
Nobuaki Sukegawa299255a2016-01-06 14:52:50 +090026
Mark Slee92195ae2007-02-21 05:16:30 +000027
Bryan Duxbury69720412012-01-03 17:32:30 +000028class TProtocolException(TException):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090029 """Custom Protocol Exception class"""
Mark Slee92195ae2007-02-21 05:16:30 +000030
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090031 UNKNOWN = 0
32 INVALID_DATA = 1
33 NEGATIVE_SIZE = 2
34 SIZE_LIMIT = 3
35 BAD_VERSION = 4
36 NOT_IMPLEMENTED = 5
37 DEPTH_LIMIT = 6
Neil Williams66a44c52018-08-13 16:12:24 -070038 INVALID_PROTOCOL = 7
Mark Slee92195ae2007-02-21 05:16:30 +000039
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090040 def __init__(self, type=UNKNOWN, message=None):
41 TException.__init__(self, message)
42 self.type = type
Mark Slee92195ae2007-02-21 05:16:30 +000043
Mark Sleecde2b612006-09-03 21:13:07 +000044
Nobuaki Sukegawab9c859a2015-12-21 01:10:25 +090045class TProtocolBase(object):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090046 """Base class for Thrift protocol driver."""
Mark Sleecde2b612006-09-03 21:13:07 +000047
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090048 def __init__(self, trans):
49 self.trans = trans
Nobuaki Sukegawa6525f6a2016-02-11 13:58:39 +090050 self._fast_decode = None
51 self._fast_encode = None
Mark Slee4ac459f2006-10-25 21:39:01 +000052
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090053 @staticmethod
54 def _check_length(limit, length):
55 if length < 0:
56 raise TTransportException(TTransportException.NEGATIVE_SIZE,
57 'Negative length: %d' % length)
58 if limit is not None and length > limit:
59 raise TTransportException(TTransportException.SIZE_LIMIT,
60 'Length exceeded max allowed: %d' % limit)
Nobuaki Sukegawa7b545b52016-01-11 13:46:04 +090061
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090062 def writeMessageBegin(self, name, ttype, seqid):
63 pass
Mark Sleecde2b612006-09-03 21:13:07 +000064
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090065 def writeMessageEnd(self):
66 pass
Mark Sleecde2b612006-09-03 21:13:07 +000067
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090068 def writeStructBegin(self, name):
69 pass
Mark Sleecde2b612006-09-03 21:13:07 +000070
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090071 def writeStructEnd(self):
72 pass
Mark Sleecde2b612006-09-03 21:13:07 +000073
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090074 def writeFieldBegin(self, name, ttype, fid):
75 pass
Mark Sleecde2b612006-09-03 21:13:07 +000076
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090077 def writeFieldEnd(self):
78 pass
Mark Sleecde2b612006-09-03 21:13:07 +000079
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090080 def writeFieldStop(self):
81 pass
Mark Sleecde2b612006-09-03 21:13:07 +000082
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090083 def writeMapBegin(self, ktype, vtype, size):
84 pass
Mark Sleecde2b612006-09-03 21:13:07 +000085
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090086 def writeMapEnd(self):
87 pass
Mark Sleecde2b612006-09-03 21:13:07 +000088
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090089 def writeListBegin(self, etype, size):
90 pass
Mark Sleecde2b612006-09-03 21:13:07 +000091
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090092 def writeListEnd(self):
93 pass
Mark Sleecde2b612006-09-03 21:13:07 +000094
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090095 def writeSetBegin(self, etype, size):
96 pass
Mark Sleecde2b612006-09-03 21:13:07 +000097
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090098 def writeSetEnd(self):
99 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000100
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900101 def writeBool(self, bool_val):
102 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000103
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900104 def writeByte(self, byte):
105 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000106
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900107 def writeI16(self, i16):
108 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000109
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900110 def writeI32(self, i32):
111 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000112
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900113 def writeI64(self, i64):
114 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000115
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900116 def writeDouble(self, dub):
117 pass
Mark Sleec98d0502006-09-06 02:42:25 +0000118
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900119 def writeString(self, str_val):
120 self.writeBinary(str_to_binary(str_val))
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900121
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900122 def writeBinary(self, str_val):
123 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000124
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900125 def writeUtf8(self, str_val):
126 self.writeString(str_val.encode('utf8'))
Nobuaki Sukegawa397bd512016-01-06 14:43:15 +0900127
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900128 def readMessageBegin(self):
129 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000130
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900131 def readMessageEnd(self):
132 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000133
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900134 def readStructBegin(self):
135 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000136
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900137 def readStructEnd(self):
138 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000139
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900140 def readFieldBegin(self):
141 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000142
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900143 def readFieldEnd(self):
144 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000145
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900146 def readMapBegin(self):
147 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000148
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900149 def readMapEnd(self):
150 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000151
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900152 def readListBegin(self):
153 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000154
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900155 def readListEnd(self):
156 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000157
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900158 def readSetBegin(self):
159 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000160
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900161 def readSetEnd(self):
162 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000163
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900164 def readBool(self):
165 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000166
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900167 def readByte(self):
168 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000169
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900170 def readI16(self):
171 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000172
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900173 def readI32(self):
174 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000175
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900176 def readI64(self):
177 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000178
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900179 def readDouble(self):
180 pass
Mark Sleec98d0502006-09-06 02:42:25 +0000181
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900182 def readString(self):
183 return binary_to_str(self.readBinary())
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900184
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900185 def readBinary(self):
186 pass
Mark Sleecde2b612006-09-03 21:13:07 +0000187
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900188 def readUtf8(self):
189 return self.readString().decode('utf8')
Nobuaki Sukegawa397bd512016-01-06 14:43:15 +0900190
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900191 def skip(self, ttype):
James E. King IIIdbc1f8d2019-02-14 16:46:38 -0500192 if ttype == TType.BOOL:
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900193 self.readBool()
194 elif ttype == TType.BYTE:
195 self.readByte()
196 elif ttype == TType.I16:
197 self.readI16()
198 elif ttype == TType.I32:
199 self.readI32()
200 elif ttype == TType.I64:
201 self.readI64()
202 elif ttype == TType.DOUBLE:
203 self.readDouble()
204 elif ttype == TType.STRING:
205 self.readString()
206 elif ttype == TType.STRUCT:
207 name = self.readStructBegin()
208 while True:
209 (name, ttype, id) = self.readFieldBegin()
210 if ttype == TType.STOP:
211 break
212 self.skip(ttype)
213 self.readFieldEnd()
214 self.readStructEnd()
215 elif ttype == TType.MAP:
216 (ktype, vtype, size) = self.readMapBegin()
217 for i in range(size):
218 self.skip(ktype)
219 self.skip(vtype)
220 self.readMapEnd()
221 elif ttype == TType.SET:
222 (etype, size) = self.readSetBegin()
223 for i in range(size):
224 self.skip(etype)
225 self.readSetEnd()
226 elif ttype == TType.LIST:
227 (etype, size) = self.readListBegin()
228 for i in range(size):
229 self.skip(etype)
230 self.readListEnd()
James E. King IIIdbc1f8d2019-02-14 16:46:38 -0500231 else:
232 raise TProtocolException(
233 TProtocolException.INVALID_DATA,
234 "invalid TType")
Mark Sleecde2b612006-09-03 21:13:07 +0000235
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900236 # tuple of: ( 'reader method' name, is_container bool, 'writer_method' name )
237 _TTYPE_HANDLERS = (
238 (None, None, False), # 0 TType.STOP
239 (None, None, False), # 1 TType.VOID # TODO: handle void?
240 ('readBool', 'writeBool', False), # 2 TType.BOOL
241 ('readByte', 'writeByte', False), # 3 TType.BYTE and I08
242 ('readDouble', 'writeDouble', False), # 4 TType.DOUBLE
243 (None, None, False), # 5 undefined
244 ('readI16', 'writeI16', False), # 6 TType.I16
245 (None, None, False), # 7 undefined
246 ('readI32', 'writeI32', False), # 8 TType.I32
247 (None, None, False), # 9 undefined
248 ('readI64', 'writeI64', False), # 10 TType.I64
249 ('readString', 'writeString', False), # 11 TType.STRING and UTF7
250 ('readContainerStruct', 'writeContainerStruct', True), # 12 *.STRUCT
251 ('readContainerMap', 'writeContainerMap', True), # 13 TType.MAP
252 ('readContainerSet', 'writeContainerSet', True), # 14 TType.SET
253 ('readContainerList', 'writeContainerList', True), # 15 TType.LIST
254 (None, None, False), # 16 TType.UTF8 # TODO: handle utf8 types?
255 (None, None, False) # 17 TType.UTF16 # TODO: handle utf16 types?
256 )
Roger Meierf4eec7a2011-09-11 18:16:21 +0000257
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900258 def _ttype_handlers(self, ttype, spec):
259 if spec == 'BINARY':
260 if ttype != TType.STRING:
261 raise TProtocolException(type=TProtocolException.INVALID_DATA,
262 message='Invalid binary field type %d' % ttype)
263 return ('readBinary', 'writeBinary', False)
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900264 return self._TTYPE_HANDLERS[ttype] if ttype < len(self._TTYPE_HANDLERS) else (None, None, False)
Nobuaki Sukegawa299255a2016-01-06 14:52:50 +0900265
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900266 def _read_by_ttype(self, ttype, spec, espec):
Elvis Pranskevichus2d1fe882017-05-23 11:36:23 -0400267 reader_name, _, is_container = self._ttype_handlers(ttype, espec)
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900268 if reader_name is None:
269 raise TProtocolException(type=TProtocolException.INVALID_DATA,
270 message='Invalid type %d' % (ttype))
271 reader_func = getattr(self, reader_name)
272 read = (lambda: reader_func(espec)) if is_container else reader_func
273 while True:
274 yield read()
Nobuaki Sukegawabc7e4802015-11-14 19:23:27 +0900275
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900276 def readFieldByTType(self, ttype, spec):
Nobuaki Sukegawa6525f6a2016-02-11 13:58:39 +0900277 return next(self._read_by_ttype(ttype, spec, spec))
Roger Meierf4eec7a2011-09-11 18:16:21 +0000278
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900279 def readContainerList(self, spec):
280 ttype, tspec, is_immutable = spec
281 (list_type, list_len) = self.readListBegin()
282 # TODO: compare types we just decoded with thrift_spec
283 elems = islice(self._read_by_ttype(ttype, spec, tspec), list_len)
284 results = (tuple if is_immutable else list)(elems)
285 self.readListEnd()
286 return results
Roger Meierf4eec7a2011-09-11 18:16:21 +0000287
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900288 def readContainerSet(self, spec):
289 ttype, tspec, is_immutable = spec
290 (set_type, set_len) = self.readSetBegin()
291 # TODO: compare types we just decoded with thrift_spec
292 elems = islice(self._read_by_ttype(ttype, spec, tspec), set_len)
293 results = (frozenset if is_immutable else set)(elems)
294 self.readSetEnd()
295 return results
Roger Meierf4eec7a2011-09-11 18:16:21 +0000296
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900297 def readContainerStruct(self, spec):
298 (obj_class, obj_spec) = spec
Elvis Pranskevichus9c439622019-12-11 16:47:52 -0500299
300 # If obj_class.read is a classmethod (e.g. in frozen structs),
301 # call it as such.
302 if getattr(obj_class.read, '__self__', None) is obj_class:
303 obj = obj_class.read(self)
304 else:
305 obj = obj_class()
306 obj.read(self)
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900307 return obj
Bryan Duxbury69720412012-01-03 17:32:30 +0000308
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900309 def readContainerMap(self, spec):
310 ktype, kspec, vtype, vspec, is_immutable = spec
311 (map_ktype, map_vtype, map_len) = self.readMapBegin()
312 # TODO: compare types we just decoded with thrift_spec and
313 # abort/skip if types disagree
314 keys = self._read_by_ttype(ktype, spec, kspec)
315 vals = self._read_by_ttype(vtype, spec, vspec)
316 keyvals = islice(zip(keys, vals), map_len)
317 results = (TFrozenDict if is_immutable else dict)(keyvals)
318 self.readMapEnd()
319 return results
Roger Meierf4eec7a2011-09-11 18:16:21 +0000320
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900321 def readStruct(self, obj, thrift_spec, is_immutable=False):
322 if is_immutable:
323 fields = {}
324 self.readStructBegin()
325 while True:
326 (fname, ftype, fid) = self.readFieldBegin()
327 if ftype == TType.STOP:
328 break
329 try:
330 field = thrift_spec[fid]
331 except IndexError:
332 self.skip(ftype)
333 else:
334 if field is not None and ftype == field[1]:
335 fname = field[2]
336 fspec = field[3]
337 val = self.readFieldByTType(ftype, fspec)
338 if is_immutable:
339 fields[fname] = val
340 else:
341 setattr(obj, fname, val)
342 else:
343 self.skip(ftype)
344 self.readFieldEnd()
345 self.readStructEnd()
346 if is_immutable:
347 return obj(**fields)
Roger Meierf4eec7a2011-09-11 18:16:21 +0000348
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900349 def writeContainerStruct(self, val, spec):
350 val.write(self)
Roger Meierf4eec7a2011-09-11 18:16:21 +0000351
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900352 def writeContainerList(self, val, spec):
353 ttype, tspec, _ = spec
354 self.writeListBegin(ttype, len(val))
355 for _ in self._write_by_ttype(ttype, val, spec, tspec):
356 pass
357 self.writeListEnd()
Roger Meierf4eec7a2011-09-11 18:16:21 +0000358
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900359 def writeContainerSet(self, val, spec):
360 ttype, tspec, _ = spec
361 self.writeSetBegin(ttype, len(val))
362 for _ in self._write_by_ttype(ttype, val, spec, tspec):
363 pass
364 self.writeSetEnd()
Roger Meierf4eec7a2011-09-11 18:16:21 +0000365
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900366 def writeContainerMap(self, val, spec):
367 ktype, kspec, vtype, vspec, _ = spec
368 self.writeMapBegin(ktype, vtype, len(val))
Alexandre Detiste8f9fba82024-08-28 14:28:39 +0200369 for _ in zip(self._write_by_ttype(ktype, val.keys(), spec, kspec),
370 self._write_by_ttype(vtype, val.values(), spec, vspec)):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900371 pass
372 self.writeMapEnd()
Roger Meierf4eec7a2011-09-11 18:16:21 +0000373
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900374 def writeStruct(self, obj, thrift_spec):
375 self.writeStructBegin(obj.__class__.__name__)
376 for field in thrift_spec:
377 if field is None:
378 continue
379 fname = field[2]
380 val = getattr(obj, fname)
381 if val is None:
382 # skip writing out unset fields
383 continue
384 fid = field[0]
385 ftype = field[1]
386 fspec = field[3]
387 self.writeFieldBegin(fname, ftype, fid)
388 self.writeFieldByTType(ftype, val, fspec)
389 self.writeFieldEnd()
390 self.writeFieldStop()
391 self.writeStructEnd()
Roger Meierf4eec7a2011-09-11 18:16:21 +0000392
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900393 def _write_by_ttype(self, ttype, vals, spec, espec):
Elvis Pranskevichus2d1fe882017-05-23 11:36:23 -0400394 _, writer_name, is_container = self._ttype_handlers(ttype, espec)
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900395 writer_func = getattr(self, writer_name)
396 write = (lambda v: writer_func(v, espec)) if is_container else writer_func
397 for v in vals:
398 yield write(v)
Nobuaki Sukegawa299255a2016-01-06 14:52:50 +0900399
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900400 def writeFieldByTType(self, ttype, val, spec):
Nobuaki Sukegawa6525f6a2016-02-11 13:58:39 +0900401 next(self._write_by_ttype(ttype, [val], spec, spec))
Roger Meierf4eec7a2011-09-11 18:16:21 +0000402
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900403
Konrad Grochowski93fea152014-10-02 16:29:14 +0200404def checkIntegerLimits(i, bits):
Konrad Grochowski07218672014-10-09 12:18:25 +0200405 if bits == 8 and (i < -128 or i > 127):
Konrad Grochowski93fea152014-10-02 16:29:14 +0200406 raise TProtocolException(TProtocolException.INVALID_DATA,
Konrad Grochowskid5f3be52014-10-08 15:32:21 +0200407 "i8 requires -128 <= number <= 127")
Konrad Grochowski07218672014-10-09 12:18:25 +0200408 elif bits == 16 and (i < -32768 or i > 32767):
Konrad Grochowskid5f3be52014-10-08 15:32:21 +0200409 raise TProtocolException(TProtocolException.INVALID_DATA,
410 "i16 requires -32768 <= number <= 32767")
Konrad Grochowski07218672014-10-09 12:18:25 +0200411 elif bits == 32 and (i < -2147483648 or i > 2147483647):
Konrad Grochowskid5f3be52014-10-08 15:32:21 +0200412 raise TProtocolException(TProtocolException.INVALID_DATA,
413 "i32 requires -2147483648 <= number <= 2147483647")
Konrad Grochowski07218672014-10-09 12:18:25 +0200414 elif bits == 64 and (i < -9223372036854775808 or i > 9223372036854775807):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900415 raise TProtocolException(TProtocolException.INVALID_DATA,
416 "i64 requires -9223372036854775808 <= number <= 9223372036854775807")
Bryan Duxbury69720412012-01-03 17:32:30 +0000417
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900418
Nobuaki Sukegawab9c859a2015-12-21 01:10:25 +0900419class TProtocolFactory(object):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900420 def getProtocol(self, trans):
421 pass