Skip to content

Commit 4375971

Browse files
kmagusiakJulien00859
authored andcommitted
[FIX] rpc: re-raise exceptions for http.py
Exceptions in RPC are handled and a Response is returned directly. It is a different behaviour than jsonrpc where the exception is raised and the dispatcher wraps it is a Response after logging the exception. The xmlrpc code should also raise an exception so that it can be handled in http.py. Adding here a way to detect if a Response was already generated for an exception in the exception handler of HTTP. closes odoo#193421 Related: odoo#193208 Signed-off-by: Julien Castiaux (juc) <[email protected]>
1 parent 13f9fa6 commit 4375971

File tree

4 files changed

+16
-9
lines changed

4 files changed

+16
-9
lines changed

addons/auth_totp/tests/test_totp.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77

88
from odoo import http
99
from odoo.addons.base.tests.common import HttpCaseWithUserDemo
10-
from odoo.exceptions import AccessDenied
11-
from odoo.service import common as auth, model
1210
from odoo.tests import tagged, get_db_name
1311
from odoo.tools import mute_logger
1412

@@ -64,7 +62,7 @@ def test_totp(self):
6462
'Trying to fake the auth type should not work'
6563
)
6664
uid = self.user_demo.id
67-
with self.assertRaisesRegex(Fault, r'Access Denied'):
65+
with self.assertRaisesRegex(Fault, r'Access Denied'), mute_logger('odoo.http'):
6866
self.xmlrpc_object.execute_kw(
6967
get_db_name(), uid, 'demo',
7068
'res.users', 'read', [uid, ['login']]

odoo/addons/base/controllers/rpc.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,11 @@ def xmlrpc_1(self, service):
137137
try:
138138
response = self._xmlrpc(service)
139139
except Exception as error:
140-
response = xmlrpc_handle_exception_string(error)
140+
error.error_response = Response(
141+
response=xmlrpc_handle_exception_string(error),
142+
mimetype='text/xml',
143+
)
144+
raise
141145
return Response(response=response, mimetype='text/xml')
142146

143147
@route("/xmlrpc/2/<service>", auth="none", methods=["POST"], csrf=False, save_session=False)
@@ -146,7 +150,11 @@ def xmlrpc_2(self, service):
146150
try:
147151
response = self._xmlrpc(service)
148152
except Exception as error:
149-
response = xmlrpc_handle_exception_int(error)
153+
error.error_response = Response(
154+
response=xmlrpc_handle_exception_int(error),
155+
mimetype='text/xml',
156+
)
157+
raise
150158
return Response(response=response, mimetype='text/xml')
151159

152160
@route('/jsonrpc', type='json', auth="none", save_session=False)

odoo/addons/test_rpc/tests/test_error.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def test_01_create(self):
2020
""" Create: mandatory field not provided """
2121
self.rpc("test_rpc.model_b", "create", {"name": "B1"})
2222
try:
23-
with mute_logger("odoo.sql_db"):
23+
with mute_logger("odoo.sql_db", "odoo.http"):
2424
self.rpc("test_rpc.model_b", "create", {})
2525
raise
2626
except Exception as e:
@@ -40,7 +40,7 @@ def test_02_delete(self):
4040
self.rpc("test_rpc.model_a", "create", {"name": "A1", "field_b1": b1, "field_b2": b2})
4141

4242
try:
43-
with mute_logger("odoo.sql_db"):
43+
with mute_logger("odoo.sql_db", "odoo.http"):
4444
self.rpc("test_rpc.model_b", "unlink", b1)
4545
raise
4646
except Exception as e:
@@ -54,7 +54,7 @@ def test_02_delete(self):
5454

5555
# Unlink b2 => ON DELETE RESTRICT constraint raises
5656
try:
57-
with mute_logger("odoo.sql_db"):
57+
with mute_logger("odoo.sql_db", "odoo.http"):
5858
self.rpc("test_rpc.model_b", "unlink", b2)
5959
raise
6060
except Exception as e:

odoo/http.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1654,7 +1654,8 @@ def _serve_db(self):
16541654
except Exception as exc:
16551655
if isinstance(exc, HTTPException) and exc.code is None:
16561656
raise # bubble up to odoo.http.Application.__call__
1657-
exc.error_response = self.registry['ir.http']._handle_error(exc)
1657+
if not hasattr(exc, 'error_response'):
1658+
exc.error_response = self.registry['ir.http']._handle_error(exc)
16581659
raise
16591660

16601661
def _serve_ir_http(self):

0 commit comments

Comments
 (0)