瀏覽代碼

Migrate to proxy utils from `mautrix`

Nick Barrett 2 年之前
父節點
當前提交
cb742d0568

+ 0 - 1
mauigpapi/__init__.py

@@ -1,4 +1,3 @@
 from .http import AndroidAPI
 from .http import AndroidAPI
 from .mqtt import AndroidMQTT, GraphQLSubscription, SkywalkerSubscription
 from .mqtt import AndroidMQTT, GraphQLSubscription, SkywalkerSubscription
-from .proxy import RETRYABLE_PROXY_EXCEPTIONS, ProxyHandler
 from .state import AndroidState
 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.types import JSON, Serializable
 from mautrix.util.logging import TraceLogger
 from mautrix.util.logging import TraceLogger
+from mautrix.util.proxy import ProxyHandler
 
 
 from ..errors import (
 from ..errors import (
     IG2FACodeExpiredError,
     IG2FACodeExpiredError,
@@ -51,7 +52,6 @@ from ..errors import (
     IGUnknownError,
     IGUnknownError,
     IGUserHasLoggedOutError,
     IGUserHasLoggedOutError,
 )
 )
-from ..proxy import ProxyHandler
 from ..state import AndroidState
 from ..state import AndroidState
 from ..types import ChallengeContext
 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 import background_task
 from mautrix.util.logging import TraceLogger
 from mautrix.util.logging import TraceLogger
+from mautrix.util.proxy import ProxyHandler
 
 
 from ..errors import (
 from ..errors import (
     IrisSubscribeError,
     IrisSubscribeError,
@@ -38,7 +39,6 @@ from ..errors import (
     MQTTNotLoggedIn,
     MQTTNotLoggedIn,
     MQTTReconnectionError,
     MQTTReconnectionError,
 )
 )
-from ..proxy import ProxyHandler
 from ..state import AndroidState
 from ..state import AndroidState
 from ..types import (
 from ..types import (
     AppPresenceEventPayload,
     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,
     IGLoginTwoFactorRequiredError,
 )
 )
 from mauigpapi.http import AndroidAPI
 from mauigpapi.http import AndroidAPI
-from mauigpapi.proxy import proxy_with_retry
 from mauigpapi.state import AndroidState
 from mauigpapi.state import AndroidState
 from mauigpapi.types import BaseResponseUser
 from mauigpapi.types import BaseResponseUser
 from mautrix.bridge.commands import HelpSection, command_handler
 from mautrix.bridge.commands import HelpSection, command_handler
 from mautrix.types import EventID
 from mautrix.types import EventID
+from mautrix.util.proxy import proxy_with_retry
 
 
 from .. import user as u
 from .. import user as u
 from .typehint import CommandEvent
 from .typehint import CommandEvent

+ 2 - 7
mautrix_instagram/user.py

@@ -22,13 +22,7 @@ import asyncio
 import logging
 import logging
 import time
 import time
 
 
-from mauigpapi import (
-    RETRYABLE_PROXY_EXCEPTIONS,
-    AndroidAPI,
-    AndroidMQTT,
-    AndroidState,
-    ProxyHandler,
-)
+from mauigpapi import AndroidAPI, AndroidMQTT, AndroidState
 from mauigpapi.errors import (
 from mauigpapi.errors import (
     IGChallengeError,
     IGChallengeError,
     IGCheckpointError,
     IGCheckpointError,
@@ -69,6 +63,7 @@ from mautrix.util import background_task
 from mautrix.util.bridge_state import BridgeState, BridgeStateEvent
 from mautrix.util.bridge_state import BridgeState, BridgeStateEvent
 from mautrix.util.logging import TraceLogger
 from mautrix.util.logging import TraceLogger
 from mautrix.util.opt_prometheus import Gauge, Summary, async_time
 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 mautrix.util.simple_lock import SimpleLock
 
 
 from . import portal as po, puppet as pu
 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,
     IGRateLimitError,
     IGResponseError,
     IGResponseError,
 )
 )
-from mauigpapi.proxy import proxy_with_retry
 from mauigpapi.types import ChallengeStateResponse, FacebookLoginResponse, LoginResponse
 from mauigpapi.types import ChallengeStateResponse, FacebookLoginResponse, LoginResponse
 from mautrix.types import JSON, Serializable, UserID
 from mautrix.types import JSON, Serializable, UserID
 from mautrix.util.logging import TraceLogger
 from mautrix.util.logging import TraceLogger
+from mautrix.util.proxy import proxy_with_retry
 
 
 from .. import user as u
 from .. import user as u
 from ..commands.auth import get_login_state
 from ..commands.auth import get_login_state