From e511ff597bb740748c4ec4864a84c240b8567dff Mon Sep 17 00:00:00 2001 From: Dark_Avery Date: Mon, 30 Mar 2026 16:38:09 +0300 Subject: [PATCH] fix(runtime): detect android bind errors as port conflicts --- proxy/app_runtime.py | 5 +++-- tests/test_app_runtime.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/proxy/app_runtime.py b/proxy/app_runtime.py index 5fb7ba8..5465b17 100644 --- a/proxy/app_runtime.py +++ b/proxy/app_runtime.py @@ -158,8 +158,9 @@ class ProxyAppRuntime: loop.run_until_complete(self.run_proxy(stop_event=stop_ev)) except Exception as exc: self.log.error("Proxy thread crashed: %s", exc) - if ("10048" in str(exc) or - "Address already in use" in str(exc)): + exc_text = str(exc) + if ("10048" in exc_text or + "address already in use" in exc_text.lower()): self._emit_error( "Не удалось запустить прокси:\n" "Порт уже используется другим приложением.\n\n" diff --git a/tests/test_app_runtime.py b/tests/test_app_runtime.py index bf3dfc7..36a4305 100644 --- a/tests/test_app_runtime.py +++ b/tests/test_app_runtime.py @@ -133,6 +133,34 @@ class ProxyAppRuntimeTests(unittest.TestCase): self.assertEqual(errors, ["proxy boom"]) + def test_run_proxy_thread_reports_port_in_use_case_insensitively(self): + with tempfile.TemporaryDirectory() as tmpdir: + errors = [] + + async def fake_run_proxy(stop_event=None): + raise RuntimeError( + "[Errno 98] error while attempting to bind on address " + "('127.0.0.1', 1443): address already in use" + ) + + runtime = ProxyAppRuntime( + Path(tmpdir), + on_error=errors.append, + run_proxy=fake_run_proxy, + ) + + runtime._run_proxy_thread(1443, {2: "149.154.167.220"}, "127.0.0.1") + + self.assertEqual( + errors, + [ + "Не удалось запустить прокси:\n" + "Порт уже используется другим приложением.\n\n" + "Закройте приложение, использующее этот порт, " + "или измените порт в настройках прокси и перезапустите." + ], + ) + if __name__ == "__main__": unittest.main()