add check

This commit is contained in:
Yuriy Yuriev
2026-05-22 18:22:41 +07:00
parent fbc01dd29f
commit 1529f27540
3 changed files with 146 additions and 41 deletions
+42 -4
View File
@@ -44,7 +44,31 @@ class Socks5ToHttpProxy:
@property
def proxy_config_for_browser(self) -> dict:
return {'server': self.local_url}
async def check_connection(
self,
test_url: str = "https://www.google.com/generate_204",
timeout: float = 10.0,
) -> bool:
"""Проверяет связность туннеля: делает запрос через локальный HTTP прокси."""
if not self._server or not self._port:
return False
try:
from aiohttp import ClientSession, ClientTimeout
from aiohttp import TCPConnector
proxy_url = self.local_url
async with ClientSession(
connector=TCPConnector(),
timeout=ClientTimeout(total=timeout),
) as session:
async with session.get(test_url, proxy=proxy_url, allow_redirects=False) as resp:
ok = resp.status in (200, 204)
logger.debug(f"Tunnel check {self.socks5_host}:{self.socks5_port}{resp.status} ok={ok}")
return ok
except Exception as e:
logger.debug(f"Tunnel check failed {self.socks5_host}:{self.socks5_port}: {e}")
return False
async def start(self) -> str:
"""Запускает прокси сервер."""
self._port = self._find_free_port()
@@ -404,22 +428,36 @@ class Socks5ProxyPool:
if key in self._last_used:
self._last_used[key] = 0
async def check_proxy(
self,
socks5_proxy,
test_url: str = "https://www.google.com/generate_204",
timeout: float = 10.0,
) -> bool:
"""Запускает туннель для прокси (если не запущен) и проверяет связность."""
await self.get_proxy_config(socks5_proxy)
async with self._lock:
tunnel = self._proxies.get(socks5_proxy.id)
if not tunnel:
return False
return await tunnel.check_connection(test_url=test_url, timeout=timeout)
async def stop_all(self):
"""Останавливает все прокси с таймаутом."""
if self._cleanup_task:
self._cleanup_task.cancel()
async with self._lock:
proxies = list(self._proxies.values())
self._proxies.clear()
self._last_used.clear()
for proxy in proxies:
try:
await asyncio.wait_for(proxy.stop(), timeout=3)
except (asyncio.TimeoutError, Exception):
pass
logger.info("All SOCKS5 proxies stopped")
@property