From c2bc87e240228442f626f26d394a51eaca015f44 Mon Sep 17 00:00:00 2001 From: Hasan AlSaafin <221141@ppu.edu.ps> Date: Sat, 4 Jul 2026 13:35:48 +0300 Subject: [PATCH] fix: deprecate implicit content_only=True default in base.requests - Add explicit deprecation warning when content_only is not set - Fix inconsistency in OAuth2 adapters that ignored content_only entirely - Add tests covering default behavior, explicit True, and explicit False Fixes #142 --- webservice/components/request_adapter.py | 21 +++++++++++++++-- webservice/tests/test_webservice.py | 30 ++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/webservice/components/request_adapter.py b/webservice/components/request_adapter.py index a7f7c943..c27513f6 100644 --- a/webservice/components/request_adapter.py +++ b/webservice/components/request_adapter.py @@ -26,7 +26,14 @@ class BaseRestRequestsAdapter(Component): # TODO: url and url_params could come from work_ctx def _request(self, method, url=None, url_params=None, **kwargs): url = self._get_url(url=url, url_params=url_params) - content_only = kwargs.pop("content_only", True) + content_only = kwargs.pop("content_only", None) + if content_only is None: + _logger.warning( + "The default value of 'content_only' will change from " + "True to False in a future version. " + "Please set it explicitly to avoid unexpected behavior." + ) + content_only = True # TODO: turn on/off debug from webservice setting? url_to_log = self._sanitize_url_for_log(url) _logger.info("%s call to %s", method, url_to_log) @@ -179,6 +186,14 @@ def _fetch_new_token(self, old_token): def _request(self, method, url=None, url_params=None, **kwargs): url = self._get_url(url=url, url_params=url_params) + content_only = kwargs.pop("content_only", None) + if content_only is None: + _logger.warning( + "The default value of 'content_only' will change from " + "True to False in a future version. " + "Please set it explicitly to avoid unexpected behavior." + ) + content_only = True new_kwargs = kwargs.copy() new_kwargs.update( { @@ -191,7 +206,9 @@ def _request(self, method, url=None, url_params=None, **kwargs): # pylint: disable=E8106 request = session.request(method, url, **new_kwargs) request.raise_for_status() - return request.content + if content_only: + return request.content + return request class WebApplicationOAuth2RestRequestsAdapter(Component): diff --git a/webservice/tests/test_webservice.py b/webservice/tests/test_webservice.py index 3c7fc312..a85c0f90 100644 --- a/webservice/tests/test_webservice.py +++ b/webservice/tests/test_webservice.py @@ -214,3 +214,33 @@ def test_web_service_call_args(self): responses.calls[0].request.headers["Content-Type"], "application/xml" ) self.assertEqual(responses.calls[0].request.headers["demo_header"], "HEADER") + @responses.activate + def test_web_service_content_only_default_true_with_warning(self): + """content_only defaults to True but should log a deprecation warning.""" + responses.add(responses.GET, self.url, body="{}") + with self.assertLogs( + "odoo.addons.webservice.components.request_adapter", level="WARNING" + ) as log_catcher: + result = self.webservice.call("get") + self.assertEqual(result, b"{}") + self.assertTrue( + any( + "content_only" in message + for message in log_catcher.output + ) + ) + + @responses.activate + def test_web_service_content_only_explicit_false(self): + """content_only=False should return the full Response object.""" + responses.add(responses.GET, self.url, body="{}") + result = self.webservice.call("get", content_only=False) + self.assertEqual(result.content, b"{}") + self.assertEqual(result.status_code, 200) + + @responses.activate + def test_web_service_content_only_explicit_true(self): + """content_only=True should return raw bytes without a warning.""" + responses.add(responses.GET, self.url, body="{}") + result = self.webservice.call("get", content_only=True) + self.assertEqual(result, b"{}")