thrift/lib/lua/TProtocol.lua
James E. King III dbc1f8def5
THRIFT-4024, THRIFT-4783: throw when skipping invalid type (#1742)
* THRIFT-4024: make c_glib throw on unsupported type when skipping
* THRIFT-4783: throw on invalid skip (py)
* THRIFT-4024: make cpp throw on unsupported type when skipping
* THRIFT-4024: uniform skip behavior on unsupported type
2019-02-14 16:46:38 -05:00

165 lines
5.0 KiB
Lua

--
-- Licensed to the Apache Software Foundation (ASF) under one
-- or more contributor license agreements. See the NOTICE file
-- distributed with this work for additional information
-- regarding copyright ownership. The ASF licenses this file
-- to you under the Apache License, Version 2.0 (the
-- "License"); you may not use this file except in compliance
-- with the License. You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing,
-- software distributed under the License is distributed on an
-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-- KIND, either express or implied. See the License for the
-- specific language governing permissions and limitations
-- under the License.
--
require 'Thrift'
TProtocolException = TException:new {
UNKNOWN = 0,
INVALID_DATA = 1,
NEGATIVE_SIZE = 2,
SIZE_LIMIT = 3,
BAD_VERSION = 4,
INVALID_PROTOCOL = 5,
DEPTH_LIMIT = 6,
errorCode = 0,
__type = 'TProtocolException'
}
function TProtocolException:__errorCodeToString()
if self.errorCode == self.INVALID_DATA then
return 'Invalid data'
elseif self.errorCode == self.NEGATIVE_SIZE then
return 'Negative size'
elseif self.errorCode == self.SIZE_LIMIT then
return 'Size limit'
elseif self.errorCode == self.BAD_VERSION then
return 'Bad version'
elseif self.errorCode == self.INVALID_PROTOCOL then
return 'Invalid protocol'
elseif self.errorCode == self.DEPTH_LIMIT then
return 'Exceeded size limit'
else
return 'Default (unknown)'
end
end
TProtocolBase = __TObject:new{
__type = 'TProtocolBase',
trans
}
function TProtocolBase:new(obj)
if ttype(obj) ~= 'table' then
error(ttype(self) .. 'must be initialized with a table')
end
-- Ensure a transport is provided
if not obj.trans then
error('You must provide ' .. ttype(self) .. ' with a trans')
end
return __TObject.new(self, obj)
end
function TProtocolBase:writeMessageBegin(name, ttype, seqid) end
function TProtocolBase:writeMessageEnd() end
function TProtocolBase:writeStructBegin(name) end
function TProtocolBase:writeStructEnd() end
function TProtocolBase:writeFieldBegin(name, ttype, id) end
function TProtocolBase:writeFieldEnd() end
function TProtocolBase:writeFieldStop() end
function TProtocolBase:writeMapBegin(ktype, vtype, size) end
function TProtocolBase:writeMapEnd() end
function TProtocolBase:writeListBegin(ttype, size) end
function TProtocolBase:writeListEnd() end
function TProtocolBase:writeSetBegin(ttype, size) end
function TProtocolBase:writeSetEnd() end
function TProtocolBase:writeBool(bool) end
function TProtocolBase:writeByte(byte) end
function TProtocolBase:writeI16(i16) end
function TProtocolBase:writeI32(i32) end
function TProtocolBase:writeI64(i64) end
function TProtocolBase:writeDouble(dub) end
function TProtocolBase:writeString(str) end
function TProtocolBase:readMessageBegin() end
function TProtocolBase:readMessageEnd() end
function TProtocolBase:readStructBegin() end
function TProtocolBase:readStructEnd() end
function TProtocolBase:readFieldBegin() end
function TProtocolBase:readFieldEnd() end
function TProtocolBase:readMapBegin() end
function TProtocolBase:readMapEnd() end
function TProtocolBase:readListBegin() end
function TProtocolBase:readListEnd() end
function TProtocolBase:readSetBegin() end
function TProtocolBase:readSetEnd() end
function TProtocolBase:readBool() end
function TProtocolBase:readByte() end
function TProtocolBase:readI16() end
function TProtocolBase:readI32() end
function TProtocolBase:readI64() end
function TProtocolBase:readDouble() end
function TProtocolBase:readString() end
function TProtocolBase:skip(ttype)
if ttype == TType.BOOL then
self:readBool()
elseif ttype == TType.BYTE then
self:readByte()
elseif ttype == TType.I16 then
self:readI16()
elseif ttype == TType.I32 then
self:readI32()
elseif ttype == TType.I64 then
self:readI64()
elseif ttype == TType.DOUBLE then
self:readDouble()
elseif ttype == TType.STRING then
self:readString()
elseif ttype == TType.STRUCT then
local name = self:readStructBegin()
while true do
local name, ttype, id = self:readFieldBegin()
if ttype == TType.STOP then
break
end
self:skip(ttype)
self:readFieldEnd()
end
self:readStructEnd()
elseif ttype == TType.MAP then
local kttype, vttype, size = self:readMapBegin()
for i = 1, size, 1 do
self:skip(kttype)
self:skip(vttype)
end
self:readMapEnd()
elseif ttype == TType.SET then
local ettype, size = self:readSetBegin()
for i = 1, size, 1 do
self:skip(ettype)
end
self:readSetEnd()
elseif ttype == TType.LIST then
local ettype, size = self:readListBegin()
for i = 1, size, 1 do
self:skip(ettype)
end
self:readListEnd()
else
terror(TProtocolException:new{
message = 'Invalid data'
})
end
end
TProtocolFactory = __TObject:new{
__type = 'TProtocolFactory',
}
function TProtocolFactory:getProtocol(trans) end