From 91641b786083440d5e0c17acf2283fefba4b21da Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Sun, 13 Sep 2026 00:05:45 +0200 Subject: [PATCH 1/2] Fix 'max_retries' request argument crashing the request '_do_rest_request' read 'max_retries' from kwargs but did not remove it, so it was passed to the requests function, which raised TypeError (e.g. 'raw_get("projects", max_retries=2)'). Pop the argument instead. Co-Authored-By: Claude Opus 5 --- ayon_api/server_api.py | 5 ++++- tests/test_request_max_retries_kwarg.py | 26 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 tests/test_request_max_retries_kwarg.py diff --git a/ayon_api/server_api.py b/ayon_api/server_api.py index e42add68c..73954efaa 100644 --- a/ayon_api/server_api.py +++ b/ayon_api/server_api.py @@ -1521,7 +1521,10 @@ def _do_rest_request( **kwargs ) -> RestApiResponse: kwargs.setdefault("timeout", self.timeout) - max_retries = kwargs.get("max_retries", self.max_retries) + # 'max_retries' must not be passed to request function + max_retries = kwargs.pop("max_retries", None) + if max_retries is None: + max_retries = self.max_retries if max_retries < 1: max_retries = 1 diff --git a/tests/test_request_max_retries_kwarg.py b/tests/test_request_max_retries_kwarg.py new file mode 100644 index 000000000..36c74cd56 --- /dev/null +++ b/tests/test_request_max_retries_kwarg.py @@ -0,0 +1,26 @@ +"""'max_retries' request argument. Does not require running AYON server.""" +import requests + +from ayon_api.server_api import ServerAPI + + +def test_max_retries_kwarg_is_not_passed_to_request(monkeypatch): + monkeypatch.setattr("time.sleep", lambda *args, **kwargs: None) + con = ServerAPI("http://localhost:0", create_session=False, max_retries=5) + calls = [] + + def request_func(url, **kwargs): + # Real request functions raise TypeError on unknown arguments + if "max_retries" in kwargs: + raise TypeError("unexpected keyword argument 'max_retries'") + calls.append(kwargs) + raise requests.exceptions.ConnectionError("down") + + response = con._do_rest_request( + request_func, + "http://localhost:0/api/x", + handle_invalid_token=False, + max_retries=2, + ) + assert len(calls) == 2 + assert response.status_code == 500 From dcadf084278384f80fbea8732fbaf59d6fa2ea80 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 14 Sep 2026 10:24:35 +0200 Subject: [PATCH 2/2] Apply suggestion from @BigRoy Co-authored-by: Roy Nieterau --- ayon_api/server_api.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ayon_api/server_api.py b/ayon_api/server_api.py index 73954efaa..1c08877c4 100644 --- a/ayon_api/server_api.py +++ b/ayon_api/server_api.py @@ -1521,10 +1521,7 @@ def _do_rest_request( **kwargs ) -> RestApiResponse: kwargs.setdefault("timeout", self.timeout) - # 'max_retries' must not be passed to request function - max_retries = kwargs.pop("max_retries", None) - if max_retries is None: - max_retries = self.max_retries + max_retries = kwargs.pop("max_retries", self.max_retries) if max_retries < 1: max_retries = 1