Skip to content

msgpack и нестандартные типы #8

@ConConovaloff

Description

@ConConovaloff

Если мы пакуем в msgpack не стандартный класс, то получаем ошибку.
Когда это происходит в ответе от msgpack сервера, то вызов повисает

Надо на выходе из Action рекурсивно проверять возвращаемый тип, и если он не входит в белый список, то выбрасывать исключение

https://github.com/msgpack-rpc/msgpack-rpc-python/blob/8cb1eebb65024294b2558dac1a0bb36652926a04/msgpackrpc/server.py

class AsyncResult:
    def set_result(self, value, error=None):
        if self._responder is not None:
            self._responder.set_result(value, error)   <----
        else:
            self._result = [value, error]

Воспроизведение ошибки:

Python 2.7.8 (default, Oct 30 2014, 17:51:12) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import msgpack
>>> packer = msgpack.Packer(default=lambda x: x.to_msgpack())
>>> packer.pack( {'some': 'wow'} )
'\x81\xa4some\xa3wow'
>>> 
>>> packer.pack( 3 )
'\x03'
>>>
>>> from decimal import *
>>> 
>>> Decimal(1)
Decimal('1')
>>> e = Decimal(1)
>>> packer.pack( e )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "msgpack/_packer.pyx", line 223, in msgpack._packer.Packer.pack (msgpack/_packer.cpp:223)
  File "msgpack/_packer.pyx", line 225, in msgpack._packer.Packer.pack (msgpack/_packer.cpp:225)
  File "msgpack/_packer.pyx", line 216, in msgpack._packer.Packer._pack (msgpack/_packer.cpp:216)
  File "<stdin>", line 1, in <lambda>
AttributeError: 'Decimal' object has no attribute 'to_msgpack'
>>>
>>> type(e)
<class 'decimal.Decimal'>
>>> type(3)
<type 'int'>
>>>


>>> con = MySQLdb.connect(...)
>>> curs = con.cursor(MySQLdb.cursors.DictCursor)
>>> curs.execute('SELECT 0.01 AS test')
1L
>>> result = curs.fetchall()
>>> type(result[0]['test'])
<class 'decimal.Decimal'>

Трасировка


Traceback (most recent call last):
  File "/opt/python/pythons/Python-2.7.8/lib/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()




  File "/opt/python/pythons/Python-2.7.8/lib/python2.7/site-packages/beget_msgpack/controller.py", line 62, in run
    self._result.set_result(self._response.dump())  <---




  File "/opt/python/pythons/Python-2.7.8/lib/python2.7/site-packages/msgpackrpc/server.py", line 67, in set_result
    self._responder.set_result(value, error)




  File "/opt/python/pythons/Python-2.7.8/lib/python2.7/site-packages/msgpackrpc/server.py", line 89, in set_result
    self._sendable.send_message([message.RESPONSE, self._msgid, error, value])



  File "/opt/python/pythons/Python-2.7.8/lib/python2.7/site-packages/msgpackrpc/transport/tcp.py", line 19, in send_message
    self._stream.write(self._packer.pack(message), callback=callback)



  File "msgpack/_packer.pyx", line 223, in msgpack._packer.Packer.pack (msgpack/_packer.cpp:223)
  File "msgpack/_packer.pyx", line 225, in msgpack._packer.Packer.pack (msgpack/_packer.cpp:225)
  File "msgpack/_packer.pyx", line 213, in msgpack._packer.Packer._pack (msgpack/_packer.cpp:213)
  File "msgpack/_packer.pyx", line 184, in msgpack._packer.Packer._pack (msgpack/_packer.cpp:184)
  File "msgpack/_packer.pyx", line 184, in msgpack._packer.Packer._pack (msgpack/_packer.cpp:184)
  File "msgpack/_packer.pyx", line 213, in msgpack._packer.Packer._pack (msgpack/_packer.cpp:213)
  File "msgpack/_packer.pyx", line 184, in msgpack._packer.Packer._pack (msgpack/_packer.cpp:184)
  File "msgpack/_packer.pyx", line 216, in msgpack._packer.Packer._pack (msgpack/_packer.cpp:216)


  File "/opt/python/pythons/Python-2.7.8/lib/python2.7/site-packages/msgpackrpc/transport/tcp.py", line 12, in <lambda>
    self._packer = msgpack.Packer(encoding=encodings[0], default=lambda x: x.to_msgpack())



AttributeError: 'Decimal' object has no attribute 'to_msgpack'

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions