Search code examples
python-3.xwsgipysimplesoapwsgiref

"AssertionError: write() argument must be a bytes instance" when running WSGISOAPHandler


I have a SOAP server with pysimplesoap in Python 3.

Code

from wsgiref.simple_server import make_server

application = WSGISOAPHandler(dispatcher)
wsgid = make_server('', 8008, application)
wsgid.serve_forever()

I don't know why am I get the following error.

Error

Traceback (most recent call last):
  File "/usr/lib/python3.4/wsgiref/handlers.py", line 138, in run
    self.finish_response()
  File "/usr/lib/python3.4/wsgiref/handlers.py", line 180, in finish_response
    self.write(data)
  File "/usr/lib/python3.4/wsgiref/handlers.py", line 266, in write
    "write() argument must be a bytes instance"
AssertionError: write() argument must be a bytes instance

Solution

  • +++ pysimplesoap/server.py  
    
                         e['name'] = k
                         if array:
                             e[:] = {'minOccurs': "0", 'maxOccurs': "unbounded"}
    -                    if v in TYPE_MAP.keys():
    -                        t = 'xsd:%s' % TYPE_MAP[v]
    -                    elif v is None:
    +
    +                    # check list and dict first to avoid
    +                    # TypeError: unhashable type: 'list' or
    +                    # TypeError: unhashable type: 'dict'
    +                    if v is None:
                             t = 'xsd:anyType'
                         elif isinstance(v, list):
                             n = "ArrayOf%s%s" % (name, k)
                             n = "%s%s" % (name, k)
                             parse_element(n, v.items(), complex=True)
                             t = "tns:%s" % n
    +                    elif v in TYPE_MAP.keys():
    +                        t = 'xsd:%s' % TYPE_MAP[v]
                         else:
                             raise TypeError("unknonw type v for marshalling" % str(v))
                         e.add_attribute('type', t)