Просмотр исходного кода

Migrate to proxy utils from `mautrix`

Nick Barrett 2 лет назад
Родитель
Сommit
cb742d0568

+ 0 - 1
mauigpapi/__init__.py

@@ -1,4 +1,3 @@
 from .http import AndroidAPI
 from .mqtt import AndroidMQTT, GraphQLSubscription, SkywalkerSubscription
-from .proxy import RETRYABLE_PROXY_EXCEPTIONS, ProxyHandler
 from .state import AndroidState

+ 1 - 1
mauigpapi/http/base.py

@@ -25,6 +25,7 @@ from yarl import URL
 
 from mautrix.types import JSON, Serializable
 from mautrix.util.logging import TraceLogger
+from mautrix.util.proxy import ProxyHandler
 
 from ..errors import (
     IG2FACodeExpiredError,
@@ -51,7 +52,6 @@ from ..errors import (
     IGUnknownError,
     IGUserHasLoggedOutError,
 )
-from ..proxy import ProxyHandler
 from ..state import AndroidState
 from ..types import ChallengeContext
 

+ 1 - 1
mauigpapi/mqtt/conn.py

@@ -30,6 +30,7 @@ import paho.mqtt.client as pmc
 
 from mautrix.util import background_task
 from mautrix.util.logging import TraceLogger
+from mautrix.util.proxy import ProxyHandler
 
 from ..errors import (
     IrisSubscribeError,
@@ -38,7 +39,6 @@ from ..errors import (
     MQTTNotLoggedIn,
     MQTTReconnectionError,
 )
-from ..proxy import ProxyHandler
 from ..state import AndroidState
 from ..types import (
     AppPresenceEventPayload,

+ 0 - 113
mauigpapi/proxy.py

@@ -1,113 +0,0 @@
-from __future__ import annotations
-
-from typing import Awaitable, Callable, TypeVar
-import asyncio
-import json
-import logging
-import urllib.request
-
-from aiohttp import ClientConnectionError
-from yarl import URL
-
-from mautrix.util.logging import TraceLogger
-
-try:
-    from aiohttp_socks import ProxyConnectionError, ProxyError, ProxyTimeoutError
-except ImportError:
-
-    class ProxyError(Exception):
-        pass
-
-    ProxyConnectionError = ProxyTimeoutError = ProxyError
-
-RETRYABLE_PROXY_EXCEPTIONS = (
-    ProxyError,
-    ProxyTimeoutError,
-    ProxyConnectionError,
-    ClientConnectionError,
-    ConnectionError,
-    asyncio.TimeoutError,
-)
-
-
-class ProxyHandler:
-    current_proxy_url: str | None = None
-    log = logging.getLogger("mauigpapi.proxy")
-
-    def __init__(self, api_url: str | None) -> None:
-        self.api_url = api_url
-
-    def get_proxy_url_from_api(self, reason: str | None = None) -> str | None:
-        assert self.api_url is not None
-
-        api_url = str(URL(self.api_url).update_query({"reason": reason} if reason else {}))
-
-        request = urllib.request.Request(api_url, method="GET")
-        self.log.debug("Requesting proxy from: %s", api_url)
-
-        try:
-            with urllib.request.urlopen(request) as f:
-                response = json.loads(f.read().decode())
-        except Exception:
-            self.log.exception("Failed to retrieve proxy from API")
-        else:
-            return response["proxy_url"]
-
-        return None
-
-    def update_proxy_url(self, reason: str | None = None) -> bool:
-        old_proxy = self.current_proxy_url
-        new_proxy = None
-
-        if self.api_url is not None:
-            new_proxy = self.get_proxy_url_from_api(reason)
-        else:
-            new_proxy = urllib.request.getproxies().get("http")
-
-        if old_proxy != new_proxy:
-            self.log.debug("Set new proxy URL: %s", new_proxy)
-            self.current_proxy_url = new_proxy
-            return True
-
-        self.log.debug("Got same proxy URL: %s", new_proxy)
-        return False
-
-    def get_proxy_url(self) -> str | None:
-        if not self.current_proxy_url:
-            self.update_proxy_url()
-
-        return self.current_proxy_url
-
-
-T = TypeVar("T")
-
-
-async def proxy_with_retry(
-    name: str,
-    func: Callable[[], Awaitable[T]],
-    logger: TraceLogger,
-    proxy_handler: ProxyHandler,
-    on_proxy_change: Callable[[], Awaitable[None]],
-    max_retries: int = 10,
-) -> T:
-    errors = 0
-
-    while True:
-        try:
-            return await func()
-        except RETRYABLE_PROXY_EXCEPTIONS as e:
-            errors += 1
-            if errors > max_retries:
-                raise
-            wait = min(errors * 10, 60)
-            logger.warning(
-                "%s while trying to %s, retrying in %d seconds",
-                e.__class__.__name__,
-                name,
-                wait,
-            )
-            await asyncio.sleep(wait)
-            if errors > 1 and proxy_handler.update_proxy_url(
-                f"{e.__class__.__name__} while trying to {name}"
-            ):
-                await on_proxy_change()

+ 1 - 1
mautrix_instagram/commands/auth.py

@@ -30,11 +30,11 @@ from mauigpapi.errors import (
     IGLoginTwoFactorRequiredError,
 )
 from mauigpapi.http import AndroidAPI
-from mauigpapi.proxy import proxy_with_retry
 from mauigpapi.state import AndroidState
 from mauigpapi.types import BaseResponseUser
 from mautrix.bridge.commands import HelpSection, command_handler
 from mautrix.types import EventID
+from mautrix.util.proxy import proxy_with_retry
 
 from .. import user as u
 from .typehint import CommandEvent

+ 2 - 7
mautrix_instagram/user.py

@@ -22,13 +22,7 @@ import asyncio
 import logging
 import time
 
-from mauigpapi import (
-    RETRYABLE_PROXY_EXCEPTIONS,
-    AndroidAPI,
-    AndroidMQTT,
-    AndroidState,
-    ProxyHandler,
-)
+from mauigpapi import AndroidAPI, AndroidMQTT, AndroidState
 from mauigpapi.errors import (
     IGChallengeError,
     IGCheckpointError,
@@ -69,6 +63,7 @@ from mautrix.util import background_task
 from mautrix.util.bridge_state import BridgeState, BridgeStateEvent
 from mautrix.util.logging import TraceLogger
 from mautrix.util.opt_prometheus import Gauge, Summary, async_time
+from mautrix.util.proxy import RETRYABLE_PROXY_EXCEPTIONS, ProxyHandler
 from mautrix.util.simple_lock import SimpleLock
 
 from . import portal as po, puppet as pu

+ 1 - 1
mautrix_instagram/web/provisioning_api.py

@@ -47,10 +47,10 @@ from mauigpapi.errors import (
     IGRateLimitError,
     IGResponseError,
 )
-from mauigpapi.proxy import proxy_with_retry
 from mauigpapi.types import ChallengeStateResponse, FacebookLoginResponse, LoginResponse
 from mautrix.types import JSON, Serializable, UserID
 from mautrix.util.logging import TraceLogger
+from mautrix.util.proxy import proxy_with_retry
 
 from .. import user as u
 from ..commands.auth import get_login_state