Проблема отправки запроса SimpleXMLRPCServer - PullRequest
3 голосов
/ 28 июня 2011

Мы разрабатываем клиент-серверное приложение на основе XML-RPC. Серверная часть должна знать IP-адрес каждого клиента для каждого запроса.

Для этого мы смешиваем SocketServer.ThreadingMixIn с SimpleXMLRPCServer и подклассом SimpleXMLRPCRequestHandler, чтобы переопределить его метод _dispatch. Ниже приведен код:

class ThreadedXMLRPCServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
    pass

class RequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
    def _dispatch(self, method, params):
        function = self.server.funcs[method]

        def decor(function, ip_addr):
            def new_function(*args):
                try:
                    return function(ip_addr, *args)
                except Exception, err:
                    log_msg('Exception ocurred in XMLRPC thread (%s)!' % err)

            return new_function

        return decor(function, self.client_address[0])(*params)

Проблема в том, что иногда запрашиваемые IP-адреса и данные запроса все смешиваются, т.е. е. запросить IP-адрес не соответствует его реальному адресу.

Есть ли какая-то проблема с последней строкой _dispatch или мы что-то упустили?

Спасибо!

1 Ответ

0 голосов
/ 14 августа 2011

Вероятно, вам следует повторно вызвать любые исключения, возникающие при вызове function(ip_addr ...) в вашем пользовательском методе _dispatch, в противном случае вы рискуете закорочить встроенную обработку ошибок.

Вот что я имею в виду ...

class RequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
    def _dispatch(self, method, params):
        function = self.server.funcs[method]

        def decor(function, ip_addr):
            def new_function(*args):
                try:
                    return function(ip_addr, *args)
                except Exception, err:
                    log_msg('Exception ocurred in XMLRPC thread (%s)!' % err)
                    raise # <---- re-raise

            return new_function

... хотя, я бы удивился, если это связано с вашей проблемой. То, что у вас должно работать нормально, насколько я могу судить.

Из любопытства, что произойдет, если вместо этого вы создадите подкласс ForkingMixin?

...