From 2610ee78e719ad0c83df6d1ae513698db185973d Mon Sep 17 00:00:00 2001 From: Lng999 Date: Tue, 20 Oct 2026 06:49:08 +0300 Subject: [PATCH] fix(lcu): retry PUT requests on the refreshed client endpoint --- lcu/core/lcu_api.py | 2 +- lcu/tests/test_lcu_api_reconnect.py | 39 +++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 lcu/tests/test_lcu_api_reconnect.py diff --git a/lcu/core/lcu_api.py b/lcu/core/lcu_api.py index 891863f0..906747a2 100644 --- a/lcu/core/lcu_api.py +++ b/lcu/core/lcu_api.py @@ -173,7 +173,7 @@ def put(self, path: str, json_data, timeout: float, headers: Optional[dict] = No try: t0 = time.perf_counter() resp = self.connection.session.put( - url, + (self.connection.base or "") + path, json=json_data, timeout=timeout, headers=headers, diff --git a/lcu/tests/test_lcu_api_reconnect.py b/lcu/tests/test_lcu_api_reconnect.py new file mode 100644 index 00000000..66d63efd --- /dev/null +++ b/lcu/tests/test_lcu_api_reconnect.py @@ -0,0 +1,39 @@ +import unittest +from types import SimpleNamespace +from unittest.mock import Mock + +import requests + +from lcu.core.lcu_api import LCUAPI + + +class PutReconnectTests(unittest.TestCase): + def test_retry_uses_refreshed_base_and_session_and_preserves_arguments(self): + old, new = Mock(), Mock() + old.put.side_effect = requests.ConnectionError('client restarted') + response = new.put.return_value + connection = SimpleNamespace(ok=True, base='https://127.0.0.1:1000', session=old) + + def refresh(force=False): + self.assertTrue(force) + connection.base = 'https://127.0.0.1:2000' + connection.session = new + + connection.refresh_if_needed = Mock(side_effect=refresh) + api = LCUAPI(connection) + api._cache_put('/resource', {'old': True}, 60) + payload, headers = [{'skinId': 1}], {'X-Test': 'value'} + self.assertIs(api.put('/resource', payload, 2.5, headers), response) + old.put.assert_called_once_with('https://127.0.0.1:1000/resource', json=payload, + timeout=2.5, headers=headers) + new.put.assert_called_once_with('https://127.0.0.1:2000/resource', json=payload, + timeout=2.5, headers=headers) + self.assertEqual(api._cache, {}) + + def test_failed_retry_returns_none(self): + session = Mock() + session.put.side_effect = requests.ConnectionError('closed') + connection = SimpleNamespace(ok=True, base='https://127.0.0.1:1000', + session=session, refresh_if_needed=Mock()) + self.assertIsNone(LCUAPI(connection).put('/resource', {}, 1)) + self.assertEqual(session.put.call_count, 2)