クライアント サーバー 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 の最後の行に何か問題がありますか、それとも何か見落としがありますか?
ありがとう!