From 7aae4d6b6f48a436512bd72103c2a7a2e3ac8378 Mon Sep 17 00:00:00 2001 From: Ashay Date: Sun, 2 Aug 2026 19:58:55 +0530 Subject: [PATCH] fix(http): sleep only when another retry is scheduled Avoid sleeping after the final failed attempt in Http.execute. Co-authored-by: Cursor --- cliboa/adapter/http.py | 6 +++++- tests/adapter/test_http.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/cliboa/adapter/http.py b/cliboa/adapter/http.py index 6dd87c67..968b9e21 100644 --- a/cliboa/adapter/http.py +++ b/cliboa/adapter/http.py @@ -44,7 +44,7 @@ def request(self): def execute(self): self._logger.info("local path: %s" % self._dest_path) res = None - for _ in range(self._retry_cnt): + for attempt in range(self._retry_cnt): try: res = self.request() res.raise_for_status() @@ -55,6 +55,10 @@ def execute(self): except Exception as e: self._logger.warning(e) + # Sleep only when another attempt will follow. + if attempt + 1 >= self._retry_cnt: + break + self._logger.warning( "Unexpected error occurred during http request. Retry will start in %s", self._retry_intvl_sec, diff --git a/tests/adapter/test_http.py b/tests/adapter/test_http.py index 09cf5f72..5f7bbd8a 100644 --- a/tests/adapter/test_http.py +++ b/tests/adapter/test_http.py @@ -60,6 +60,20 @@ def test_execute_ng(self, mock_get): d.execute() assert "Http request failed" in str(execinfo.value) + @patch("cliboa.adapter.http.sleep") + @patch("cliboa.adapter.http.requests.get") + def test_execute_ng_no_sleep_on_final_attempt(self, mock_get, mock_sleep): + mock_get.side_effect = HTTPError("Http request failed.") + + url = "https://spam.com/get" + timeout = 1 + retry_cnt = 1 + retry_intvl_sec = 1 + d = Download(url, self._dest_path, timeout, retry_cnt, retry_intvl_sec) + with pytest.raises(HTTPError): + d.execute() + mock_sleep.assert_not_called() + class TestUpload(object): def setup_method(self, method):