From 5f6e665339917c2eb8c0788fedb7820f60746630 Mon Sep 17 00:00:00 2001 From: ivan2282 <90458162+ivan2282-i28@users.noreply.github.com> Date: Mon, 16 Jun 2025 13:52:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=AF=20=D0=B7=D0=B0=D0=BF=D1=80=D0=B5=D1=89?= =?UTF-8?q?=D0=B0=D1=8E=20=D1=82=D1=83=D1=82=20=D0=B2=D0=BE=D0=BD=D1=8F?= =?UTF-8?q?=D1=82=D1=8C=20cloudflare?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- heroku/web/base_tunnel.py | 11 ------ heroku/web/cloudflare_tunnel.py | 62 --------------------------------- heroku/web/proxypass.py | 2 -- heroku/web/ssh_tunnel.py | 3 +- 4 files changed, 1 insertion(+), 77 deletions(-) delete mode 100644 heroku/web/base_tunnel.py delete mode 100644 heroku/web/cloudflare_tunnel.py diff --git a/heroku/web/base_tunnel.py b/heroku/web/base_tunnel.py deleted file mode 100644 index 9281006..0000000 --- a/heroku/web/base_tunnel.py +++ /dev/null @@ -1,11 +0,0 @@ -import typing - -class BaseTunnel: - async def start(self): - raise NotImplementedError("Subclasses must implement the 'start' method.") - - async def stop(self): - raise NotImplementedError("Subclasses must implement the 'stop' method.") - - async def wait_for_url(self, timeout: float) -> typing.Optional[str]: - raise NotImplementedError("Subclasses must implement the 'wait_for_url' method.") \ No newline at end of file diff --git a/heroku/web/cloudflare_tunnel.py b/heroku/web/cloudflare_tunnel.py deleted file mode 100644 index 396d7de..0000000 --- a/heroku/web/cloudflare_tunnel.py +++ /dev/null @@ -1,62 +0,0 @@ -import typing -import logging -import asyncio -import contextvars -import functools - -from pycloudflared import try_cloudflare - -from .base_tunnel import BaseTunnel - - -logger = logging.getLogger(__name__) - - -class CloudflareTunnel(BaseTunnel): - def __init__( - self, - port: int, - verbose: bool = False, - change_url_callback: typing.Callable[[str], None] = None, - ): - self.port = port - self.verbose = verbose - self._change_url_callback = change_url_callback - self._tunnel_url = None - self._url_available = asyncio.Event() - self._url_available.clear() - - # to support python 3.8... - async def to_thread(self, func, /, *args, **kwargs): - loop = asyncio.get_running_loop() - ctx = contextvars.copy_context() - func_call = functools.partial(ctx.run, func, *args, **kwargs) - return await loop.run_in_executor(None, func_call) - - async def start(self): - logger.debug(f"Attempting Cloudflare tunnel on port {self.port}...") - - try: - self._tunnel_url = (await self.to_thread(try_cloudflare, port=self.port, verbose=self.verbose)).tunnel - logger.debug(f"Cloudflare tunnel established: {self._tunnel_url}") - - if self._change_url_callback: - self._change_url_callback(self._tunnel_url) - - self._url_available.set() - - except Exception as e: - logger.error(f"Failed to establish Cloudflare tunnel: {e}") - raise - - async def stop(self): - logger.debug("Stopping Cloudflare tunnel...") - try_cloudflare.terminate(self.port) - - async def wait_for_url(self, timeout: float) -> typing.Optional[str]: - try: - await asyncio.wait_for(self._url_available.wait(), timeout) - return self._tunnel_url - except asyncio.TimeoutError: - logger.warning("Timeout waiting for Cloudflare URL.") - return None \ No newline at end of file diff --git a/heroku/web/proxypass.py b/heroku/web/proxypass.py index 696a080..7ded992 100644 --- a/heroku/web/proxypass.py +++ b/heroku/web/proxypass.py @@ -8,7 +8,6 @@ import os import logging import typing from .ssh_tunnel import SSHTunnel -from .cloudflare_tunnel import CloudflareTunnel logger = logging.getLogger(__name__) @@ -27,7 +26,6 @@ class ProxyPasser: self._verbose = verbose self._tunnels = [ SSHTunnel(port=port, change_url_callback=self._on_url_change), - CloudflareTunnel(port=port, verbose=verbose, change_url_callback=self._on_url_change) ] diff --git a/heroku/web/ssh_tunnel.py b/heroku/web/ssh_tunnel.py index cd2575f..fade8cd 100644 --- a/heroku/web/ssh_tunnel.py +++ b/heroku/web/ssh_tunnel.py @@ -3,11 +3,10 @@ import logging import asyncio import re -from .base_tunnel import BaseTunnel logger = logging.getLogger(__name__) -class SSHTunnel(BaseTunnel): +class SSHTunnel(): def __init__( self, port: int,