diff --git a/docs/requirements.txt b/docs/requirements.txt index ecf7317..96865ff 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -8,5 +8,5 @@ sphinx-toolbox>=2.16.0 cffi~=1.17.1 cryptography~=44.0.1 pycparser~=2.22 -websockets~=14.2 +websockets~=15.0.0 enum_tools \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 0449e97..cabe955 100644 Binary files a/requirements.txt and b/requirements.txt differ diff --git a/setup.cfg b/setup.cfg index 7117231..ce7c3f8 100644 --- a/setup.cfg +++ b/setup.cfg @@ -45,7 +45,7 @@ python_requires = >=3.8 install_requires = importlib-metadata cryptography~=44.0.1 - websockets~=14.2 + websockets~=15.0.0 python-socks[asyncio]~=2.5.3 diff --git a/src/meshctrl/session.py b/src/meshctrl/session.py index 119b05f..1eb6b6c 100644 --- a/src/meshctrl/session.py +++ b/src/meshctrl/session.py @@ -144,7 +144,7 @@ class Session(object): options["additional_headers"] = headers - async for websocket in util.proxy_connect(self.url, proxy_url=self._proxy, process_exception=util._process_websocket_exception, **options): + async for websocket in websockets.asyncio.client.connect(self.url, proxy=self._proxy, process_exception=util._process_websocket_exception, **options): self.alive = True self._socket_open.set() try: diff --git a/src/meshctrl/tunnel.py b/src/meshctrl/tunnel.py index 25b9abe..28e7ee5 100644 --- a/src/meshctrl/tunnel.py +++ b/src/meshctrl/tunnel.py @@ -67,7 +67,7 @@ class Tunnel(object): self.url = self._session.url.replace('/control.ashx', '/meshrelay.ashx?browser=1&p=' + str(self._protocol) + '&nodeid=' + self.node_id + '&id=' + self._tunnel_id + '&auth=' + self._authcookie["cookie"]) - async for websocket in util.proxy_connect(self.url, proxy_url=self._session._proxy, process_exception=util._process_websocket_exception, **options): + async for websocket in websockets.asyncio.client.connect(self.url, proxy=self._session._proxy, process_exception=util._process_websocket_exception, **options): self.alive = True self._socket_open.set() try: diff --git a/src/meshctrl/util.py b/src/meshctrl/util.py index b245d59..76f4ca9 100644 --- a/src/meshctrl/util.py +++ b/src/meshctrl/util.py @@ -11,7 +11,6 @@ import ssl import functools import urllib import python_socks -from python_socks.async_.asyncio import Proxy from . import exceptions def _encode_cookie(o, key): @@ -164,17 +163,7 @@ def _process_websocket_exception(exc): return exc if isinstance(exc, python_socks._errors.ProxyError): return None - return tmp - -class proxy_connect(websockets.asyncio.client.connect): - def __init__(self,*args, proxy_url=None, **kwargs): - self.proxy = None - if proxy_url is not None: - self.proxy = Proxy.from_url(proxy_url) - super().__init__(*args, **kwargs) - - async def create_connection(self, *args, **kwargs): - if self.proxy is not None: - parsed = urllib.parse.urlparse(self.uri) - self.connection_kwargs["sock"] = await self.proxy.connect(dest_host=parsed.hostname, dest_port=parsed.port) - return await super().create_connection(*args, **kwargs) \ No newline at end of file + # Proxy errors show up like this now, and it's default to error out. Handle explicitly. + if isinstance(exc, websockets.exceptions.InvalidProxyMessage): + return None + return tmp \ No newline at end of file diff --git a/tests/requirements.txt b/tests/requirements.txt index c6afd10..539d7da 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -3,4 +3,4 @@ pytest-asyncio cffi==1.17.1 cryptography~=44.0.1 pycparser==2.22 -websockets~=14.2 \ No newline at end of file +websockets~=15.0.0 \ No newline at end of file diff --git a/tests/test_session.py b/tests/test_session.py index 197220a..ca2d163 100644 --- a/tests/test_session.py +++ b/tests/test_session.py @@ -46,9 +46,11 @@ async def test_auto_reconnect(env): for i in range(3): try: await admin_session.ping(timeout=10) - except: - continue - break + except* Exception as e: + print("".join(traceback.format_exception(e))) + pass + else: + break else: raise Exception("Failed to reconnect") @@ -57,6 +59,7 @@ async def test_auto_reconnect(env): try: await admin_session.ping(timeout=10) except* Exception as e: + print("".join(traceback.format_exception(e))) pass else: break