diff --git a/awips/ThriftClient.py b/awips/ThriftClient.py index 38ed1cc..c2908a1 100644 --- a/awips/ThriftClient.py +++ b/awips/ThriftClient.py @@ -69,14 +69,13 @@ class ThriftClient: def sendRequest(self, request, uri="/thrift"): message = self.__dsm.serializeObject(request) - + #message = message.decode('cp437') self.__httpConn.connect() self.__httpConn.request("POST", self.__uri + uri, message) response = self.__httpConn.getresponse() if (response.status != 200): raise ThriftRequestException("Unable to post request to server") - rval = self.__dsm.deserializeBytes(response.read()) self.__httpConn.close() diff --git a/dynamicserialize/ThriftSerializationContext.py b/dynamicserialize/ThriftSerializationContext.py index c9ffaea..a68d96f 100644 --- a/dynamicserialize/ThriftSerializationContext.py +++ b/dynamicserialize/ThriftSerializationContext.py @@ -75,6 +75,7 @@ pythonToThriftMap = { #types.FloatType: TType.DOUBLE, bool: TType.BOOL, object: TType.STRUCT, + str: TType.STRING, type(None): TType.VOID, numpy.float32: SelfDescribingBinaryProtocol.FLOAT, numpy.int32: TType.I32, @@ -151,13 +152,15 @@ class ThriftSerializationContext(object): def deserializeMessage(self): name = self.protocol.readStructBegin() - name = name.replace('_', '.') + #print(name) + name = name.replace(b'_', b'.') + bytes(name) if name.isdigit(): obj = self._deserializeType(int(name)) return obj elif name in adapters.classAdapterRegistry: return adapters.classAdapterRegistry[name].deserialize(self) - elif name.find('$') > -1: + elif name.find(b'$') > -1: # it's an inner class, we're going to hope it's an enum, treat it special fieldName, fieldType, fieldId = self.protocol.readFieldBegin() if fieldName != '__enumValue__': @@ -166,7 +169,7 @@ class ThriftSerializationContext(object): self.protocol.readFieldEnd() return obj else: - clz = dsObjTypes[name] + clz = dsObjTypes[bytes.decode(name)] obj = clz() while self._deserializeField(name, obj): @@ -191,7 +194,8 @@ class ThriftSerializationContext(object): # result = adapters.fieldAdapterRegistry[structname][fieldName].deserialize(self) # else: result = self._deserializeType(fieldType) - lookingFor = "set" + fieldName[0].upper() + fieldName[1:] + fn_str = bytes.decode(fieldName) + lookingFor = "set" + fn_str[0].upper() + fn_str[1:] try: setMethod = getattr(obj, lookingFor) @@ -244,13 +248,13 @@ class ThriftSerializationContext(object): if pyt in pythonToThriftMap: return pythonToThriftMap[pyt] elif pyt.__module__.startswith('dynamicserialize.dstypes'): - return pythonToThriftMap[types.InstanceType] + return pythonToThriftMap[object] else: raise dynamicserialize.SerializationException("Don't know how to serialize object of type: " + str(pyt)) def serializeMessage(self, obj): + tt = self._lookupType(obj) - if tt == TType.STRUCT: fqn = obj.__module__.replace('dynamicserialize.dstypes.', '') if fqn in adapters.classAdapterRegistry: @@ -288,9 +292,11 @@ class ThriftSerializationContext(object): self.protocol.writeStructEnd() def _serializeField(self, fieldName, fieldType, fieldId, fieldValue): + #print("SERFIELD", fieldName, fieldType, fieldId, fieldValue) self.protocol.writeFieldBegin(fieldName, fieldType, fieldId) self._serializeType(fieldValue, fieldType) self.protocol.writeFieldEnd() + #print(self.protocol) def _serializeType(self, fieldValue, fieldType): if fieldType in self.typeSerializationMethod: diff --git a/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/level/Level.py b/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/level/Level.py index 309f9d7..32bc996 100644 --- a/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/level/Level.py +++ b/dynamicserialize/dstypes/com/raytheon/uf/common/dataplugin/level/Level.py @@ -55,7 +55,7 @@ class Level(object): matcher = LEVEL_NAMING_REGEX.match(str(levelString)) if matcher is not None: self.levelonevalue = numpy.float64(matcher.group(1)) - self.masterLevel = MasterLevel.MasterLevel(matcher.group(3)) + self.masterLevel = MasterLevel(matcher.group(3)) levelTwo = matcher.group(2) if levelTwo: self.leveltwovalue = numpy.float64(levelTwo) diff --git a/dynamicserialize/dstypes/com/raytheon/uf/common/time/DataTime.py b/dynamicserialize/dstypes/com/raytheon/uf/common/time/DataTime.py index af96b40..6dc4088 100644 --- a/dynamicserialize/dstypes/com/raytheon/uf/common/time/DataTime.py +++ b/dynamicserialize/dstypes/com/raytheon/uf/common/time/DataTime.py @@ -40,7 +40,7 @@ import calendar import datetime import numpy import time -import io +from six.moves import cStringIO as StringIO from dynamicserialize.dstypes.java.util import Date from dynamicserialize.dstypes.java.util import EnumSet @@ -114,7 +114,7 @@ class DataTime(object): self.levelValue = numpy.float64(levelValue) def __str__(self): - buffer = io.StringIO() + buffer = StringIO() if self.refTime is not None: refTimeInSecs = self.refTime.getTime() / 1000 diff --git a/thrift/protocol/TBinaryProtocol.py b/thrift/protocol/TBinaryProtocol.py index 2af4a2d..dbcb1e9 100644 --- a/thrift/protocol/TBinaryProtocol.py +++ b/thrift/protocol/TBinaryProtocol.py @@ -204,7 +204,11 @@ class TBinaryProtocol(TProtocolBase): def readI32(self): buff = self.trans.readAll(4) - val, = unpack('!i', buff) + try: + val, = unpack('!i', buff) + except TypeError: + #str does not support the buffer interface + val, = unpack('!i', buff) return val def readI64(self): diff --git a/thrift/transport/TTransport.py b/thrift/transport/TTransport.py index eae4b9a..c72ad06 100644 --- a/thrift/transport/TTransport.py +++ b/thrift/transport/TTransport.py @@ -17,7 +17,7 @@ # under the License. # -from io import StringIO +from six import BytesIO from struct import pack, unpack from thrift.Thrift import TException @@ -52,9 +52,10 @@ class TTransportBase: pass def readAll(self, sz): - buff = '' + buff = b'' have = 0 while (have < sz): + #print(self) chunk = self.read(sz - have) have += len(chunk) buff += chunk @@ -138,8 +139,8 @@ class TBufferedTransport(TTransportBase, CReadableTransport): def __init__(self, trans, rbuf_size=DEFAULT_BUFFER): self.__trans = trans - self.__wbuf = StringIO() - self.__rbuf = StringIO("") + self.__wbuf = BytesIO() + self.__rbuf = BytesIO("") self.__rbuf_size = rbuf_size def isOpen(self): @@ -156,7 +157,7 @@ class TBufferedTransport(TTransportBase, CReadableTransport): if len(ret) != 0: return ret - self.__rbuf = StringIO(self.__trans.read(max(sz, self.__rbuf_size))) + self.__rbuf = BytesIO(self.__trans.read(max(sz, self.__rbuf_size))) return self.__rbuf.read(sz) def write(self, buf): @@ -165,7 +166,7 @@ class TBufferedTransport(TTransportBase, CReadableTransport): def flush(self): out = self.__wbuf.getvalue() # reset wbuf before write/flush to preserve state on underlying failure - self.__wbuf = StringIO() + self.__wbuf = BytesIO() self.__trans.write(out) self.__trans.flush() @@ -184,7 +185,7 @@ class TBufferedTransport(TTransportBase, CReadableTransport): if len(retstring) < reqlen: retstring += self.__trans.readAll(reqlen - len(retstring)) - self.__rbuf = StringIO(retstring) + self.__rbuf = BytesIO(retstring) return self.__rbuf @@ -203,9 +204,9 @@ class TMemoryBuffer(TTransportBase, CReadableTransport): If value is set, this will be a transport for reading, otherwise, it is for writing""" if value is not None: - self._buffer = StringIO(value) + self._buffer = BytesIO(value) else: - self._buffer = StringIO() + self._buffer = BytesIO() def isOpen(self): return not self._buffer.closed @@ -220,7 +221,10 @@ class TMemoryBuffer(TTransportBase, CReadableTransport): return self._buffer.read(sz) def write(self, buf): - self._buffer.write(buf) + try: + self._buffer.write(buf) + except TypeError: + self._buffer.write(buf.encode('cp437')) def flush(self): pass @@ -251,8 +255,8 @@ class TFramedTransport(TTransportBase, CReadableTransport): def __init__(self, trans,): self.__trans = trans - self.__rbuf = StringIO() - self.__wbuf = StringIO() + self.__rbuf = BytesIO() + self.__wbuf = BytesIO() def isOpen(self): return self.__trans.isOpen() @@ -274,7 +278,7 @@ class TFramedTransport(TTransportBase, CReadableTransport): def readFrame(self): buff = self.__trans.readAll(4) sz, = unpack('!i', buff) - self.__rbuf = StringIO(self.__trans.readAll(sz)) + self.__rbuf = BytesIO(self.__trans.readAll(sz)) def write(self, buf): self.__wbuf.write(buf) @@ -283,7 +287,7 @@ class TFramedTransport(TTransportBase, CReadableTransport): wout = self.__wbuf.getvalue() wsz = len(wout) # reset wbuf before write/flush to preserve state on underlying failure - self.__wbuf = StringIO() + self.__wbuf = BytesIO() # N.B.: Doing this string concatenation is WAY cheaper than making # two separate calls to the underlying socket object. Socket writes in # Python turn out to be REALLY expensive, but it seems to do a pretty @@ -304,7 +308,7 @@ class TFramedTransport(TTransportBase, CReadableTransport): while len(prefix) < reqlen: self.readFrame() prefix += self.__rbuf.getvalue() - self.__rbuf = StringIO(prefix) + self.__rbuf = BytesIO(prefix) return self.__rbuf