0

I have a XML RPC server against which I need to register some functions which are decorated. Every time I call those registered functions from client, I get below error:

xmlrpclib.Fault: :method "test" is not supported'>

Below is the code:

Server Code:

from SimpleXMLRPCServer import SimpleXMLRPCServer
import functools
import xmlrpclib

class Server(object):
  def __init__(self, hostport):
    self.server = SimpleXMLRPCServer(hostport)

  def serve_forever(self):
    self.server.serve_forever()

server = Server(('localhost', 8000))

def wrapper(func):
  def checker(*args):
    if isinstance(args[-1], dict):
      args = list(args)
      kwargs = args.pop(args[-1])
      return func(*args, **kwargs)
    else:
      return func(*args)
  return checker

@wrapper
def test(kwargs):
  print kwargs
  return 0

server.server.register_function(wrapper, "wrapper")
server.server.register_function(test, "test")
server.serve_forever()

Client Code:

import xmlrpclib
import functools
import inspect

_orig_Method = xmlrpclib._Method

class KeywordArgMethod(_orig_Method):
    def __call__(self, *args, **kwargs):
        args = list(args)
        if kwargs:
          args = list(args)
          args.append(kwargs)
        return _orig_Method.__call__(self, *args)

xmlrpclib._Method = KeywordArgMethod

class ServerProxy(object):
    def __init__(self, url):
        self._xmlrpc_server_proxy = xmlrpclib.ServerProxy(url)

#example usage
if __name__ == "__main__":
  server = ServerProxy('http://localhost:8000')
  server._xmlrpc_server_proxy.test(**{'arg1':1, 'arg2':2})

How can this error be resolved. What is the preferred way to call decorated functions using XML RPC in python.

user2819403
  • 37
  • 1
  • 8

1 Answers1

0

Just add a name for function on register. server.register_function(test, "test") works good.

But you also need fix decorator itself: AttributeError: "'tuple' object has no attribute 'pop'"

Ivan Burlutskiy
  • 1,605
  • 1
  • 12
  • 22
  • I modified the code and now I am getting a different exception: `File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xmlrpclib.py", line 793, in close raise Fault(**self._stack[0]) xmlrpclib.Fault: :an integer is required">` @Shpionus: Any idea why this error is coming? – user2819403 Jun 24 '16 at 15:41