summaryrefslogtreecommitdiff
path: root/odoo/addons/base/controllers/rpc.py
diff options
context:
space:
mode:
authorJairo Llopis <Yajo@users.noreply.github.com>2018-05-09 08:46:15 +0100
committerxmo-odoo <xmo@odoo.com>2018-05-09 09:46:15 +0200
commit285ead28e31ca54e9629d5153d0d03d7b4951535 (patch)
tree3de03167228179eff72a3d12f2b42cd11c0d7803 /odoo/addons/base/controllers/rpc.py
parente9e8fd24cf77397d57b73fb6ceb9befd326de19b (diff)
[IMP] Handle XMLRPC calls from standard controllers
This way, XMLRPC calls can get request details form the standard `odoo.http.request` system. Move jsonrpc to the same controller while at it, for coherence. Fix #24183
Diffstat (limited to 'odoo/addons/base/controllers/rpc.py')
-rw-r--r--odoo/addons/base/controllers/rpc.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/odoo/addons/base/controllers/rpc.py b/odoo/addons/base/controllers/rpc.py
new file mode 100644
index 00000000000..f58bcda1605
--- /dev/null
+++ b/odoo/addons/base/controllers/rpc.py
@@ -0,0 +1,44 @@
+from xmlrpc.client import dumps, loads
+
+from werkzeug.wrappers import Response
+
+from odoo.http import Controller, dispatch_rpc, request, route
+from odoo.service import wsgi_server
+
+
+class RPC(Controller):
+ """Handle RPC connections."""
+
+ def _xmlrpc(self, service):
+ """Common method to handle an XML-RPC request."""
+ data = request.httprequest.get_data()
+ params, method = loads(data)
+ result = dispatch_rpc(service, method, params)
+ return dumps((result,), methodresponse=1, allow_none=False)
+
+ @route("/xmlrpc/<service>", auth="none", method="POST", csrf=False)
+ def xmlrpc_1(self, service):
+ """XML-RPC service that returns faultCode as strings.
+
+ This entrypoint is historical and non-compliant, but kept for
+ backwards-compatibility.
+ """
+ try:
+ response = self._xmlrpc(service)
+ except Exception as error:
+ response = wsgi_server.xmlrpc_handle_exception_string(error)
+ return Response(response=response, mimetype='text/xml')
+
+ @route("/xmlrpc/2/<service>", auth="none", method="POST", csrf=False)
+ def xmlrpc_2(self, service):
+ """XML-RPC service that returns faultCode as int."""
+ try:
+ response = self._xmlrpc(service)
+ except Exception as error:
+ response = wsgi_server.xmlrpc_handle_exception_int(error)
+ return Response(response=response, mimetype='text/xml')
+
+ @route('/jsonrpc', type='json', auth="none")
+ def jsonrpc(self, service, method, args):
+ """ Method used by client APIs to contact OpenERP. """
+ return dispatch_rpc(service, method, args)