From 9aeba4fece4f03c64cc9c2b12104aed3cf1bff11 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 2 Sep 2011 16:12:32 +0200 Subject: [PATCH] [REF] netsvc.OpenERPDispatcher: that class is gone, replaced by a simple function. bzr revid: vmt@openerp.com-20110902141232-umpscnz2cot468hy --- openerp-server | 2 +- openerp/netsvc.py | 62 ++++++++++++++++---------------- openerp/service/http_server.py | 7 ++-- openerp/service/netrpc_server.py | 5 +-- 4 files changed, 37 insertions(+), 39 deletions(-) diff --git a/openerp-server b/openerp-server index bc4a661b08a..30d08f2b3da 100755 --- a/openerp-server +++ b/openerp-server @@ -266,7 +266,7 @@ if __name__ == "__main__": if info['wsgi']: openerp.wsgi.register_wsgi_handler(getattr(sys.modules[m], info['wsgi'])) - openerp.wsgi.serve() + #openerp.wsgi.serve() setup_pid_file() diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 0892d47c646..0a95d1c824b 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -393,38 +393,36 @@ def log(title, msg, channel=logging.DEBUG_RPC, depth=None, fn=""): logger.log(channel, indent+line) indent=indent_after -# This class is used to dispatch a RPC to a service. So it is used -# for both XMLRPC (with a SimpleXMLRPCRequestHandler), and NETRPC. -# The service (ExportService) will then dispatch on the method name. -# This can be re-written as a single function -# def dispatch(self, service_name, method, params, auth_provider). -class OpenERPDispatcher: - def log(self, title, msg, channel=logging.DEBUG_RPC, depth=None, fn=""): +def dispatch_rpc(service_name, method, params, auth): + """ Handle a RPC call. + + This is pure Python code, the actual marshalling (from/to XML-RPC or + NET-RPC) is done in a upper laye. + """ + def _log(title, msg, channel=logging.DEBUG_RPC, depth=None, fn=""): log(title, msg, channel=channel, depth=depth, fn=fn) - def dispatch(self, service_name, method, params): - try: - auth = getattr(self, 'auth_provider', None) - logger = logging.getLogger('result') - start_time = end_time = 0 - if logger.isEnabledFor(logging.DEBUG_RPC_ANSWER): - self.log('service', tuple(replace_request_password(params)), depth=None, fn='%s.%s'%(service_name,method)) - if logger.isEnabledFor(logging.DEBUG_RPC): - start_time = time.time() - result = ExportService.getService(service_name).dispatch(method, auth, params) - if logger.isEnabledFor(logging.DEBUG_RPC): - end_time = time.time() - if not logger.isEnabledFor(logging.DEBUG_RPC_ANSWER): - self.log('service (%.3fs)' % (end_time - start_time), tuple(replace_request_password(params)), depth=1, fn='%s.%s'%(service_name,method)) - self.log('execution time', '%.3fs' % (end_time - start_time), channel=logging.DEBUG_RPC_ANSWER) - self.log('result', result, channel=logging.DEBUG_RPC_ANSWER) - return result - except Exception, e: - self.log('exception', tools.exception_to_unicode(e)) - tb = getattr(e, 'traceback', sys.exc_info()) - tb_s = "".join(traceback.format_exception(*tb)) - if tools.config['debug_mode'] and isinstance(tb[2], types.TracebackType): - import pdb - pdb.post_mortem(tb[2]) - raise OpenERPDispatcherException(e, tb_s) + try: + logger = logging.getLogger('result') + start_time = end_time = 0 + if logger.isEnabledFor(logging.DEBUG_RPC_ANSWER): + _log('service', tuple(replace_request_password(params)), depth=None, fn='%s.%s'%(service_name,method)) + if logger.isEnabledFor(logging.DEBUG_RPC): + start_time = time.time() + result = ExportService.getService(service_name).dispatch(method, auth, params) + if logger.isEnabledFor(logging.DEBUG_RPC): + end_time = time.time() + if not logger.isEnabledFor(logging.DEBUG_RPC_ANSWER): + _log('service (%.3fs)' % (end_time - start_time), tuple(replace_request_password(params)), depth=1, fn='%s.%s'%(service_name,method)) + _log('execution time', '%.3fs' % (end_time - start_time), channel=logging.DEBUG_RPC_ANSWER) + _log('result', result, channel=logging.DEBUG_RPC_ANSWER) + return result + except Exception, e: + _log('exception', tools.exception_to_unicode(e)) + tb = getattr(e, 'traceback', sys.exc_info()) + tb_s = "".join(traceback.format_exception(*tb)) + if tools.config['debug_mode'] and isinstance(tb[2], types.TracebackType): + import pdb + pdb.post_mortem(tb[2]) + raise OpenERPDispatcherException(e, tb_s) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/service/http_server.py b/openerp/service/http_server.py index d22d32aabeb..3e76c3810ef 100644 --- a/openerp/service/http_server.py +++ b/openerp/service/http_server.py @@ -271,9 +271,7 @@ def list_http_services(protocol=None): raise Exception("Incorrect protocol or no http services") import SimpleXMLRPCServer -# Basically, this class extends SimpleXMLRPCRequestHandler to use -# OpenERPDispatcher as the dispatcher (to select the correct ExportService). -class XMLRPCRequestHandler(netsvc.OpenERPDispatcher,FixSendError,HttpLogHandler,SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): +class XMLRPCRequestHandler(FixSendError,HttpLogHandler,SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): rpc_paths = [] protocol_version = 'HTTP/1.1' _logger = logging.getLogger('xmlrpc') @@ -281,7 +279,8 @@ class XMLRPCRequestHandler(netsvc.OpenERPDispatcher,FixSendError,HttpLogHandler, def _dispatch(self, method, params): try: service_name = self.path.split("/")[-1] - return self.dispatch(service_name, method, params) + auth = getattr(self, 'auth_provider', None) + return netsvc.dispatch_rpc(service_name, method, params, auth) except netsvc.OpenERPDispatcherException, e: raise xmlrpclib.Fault(tools.exception_to_unicode(e.exception), e.traceback) diff --git a/openerp/service/netrpc_server.py b/openerp/service/netrpc_server.py index 70855a018e5..f99253a1e76 100644 --- a/openerp/service/netrpc_server.py +++ b/openerp/service/netrpc_server.py @@ -36,7 +36,7 @@ import openerp.netsvc as netsvc import openerp.tiny_socket as tiny_socket import openerp.tools as tools -class TinySocketClientThread(threading.Thread, netsvc.OpenERPDispatcher): +class TinySocketClientThread(threading.Thread): def __init__(self, sock, threads): spn = sock and sock.getpeername() spn = 'netrpc-client-%s:%s' % spn[0:2] @@ -59,7 +59,8 @@ class TinySocketClientThread(threading.Thread, netsvc.OpenERPDispatcher): while self.running: try: msg = ts.myreceive() - result = self.dispatch(msg[0], msg[1], msg[2:]) + auth = getattr(self, 'auth_provider', None) + result = netsvc.dispatch_rpc(msg[0], msg[1], msg[2:], auth) ts.mysend(result) except socket.timeout: #terminate this channel because other endpoint is gone