Browse Source

Add reason to API based proxy fetching

Toni Spets 2 years ago
parent
commit
e2f6cc21ea
3 changed files with 15 additions and 10 deletions
  1. 4 4
      mauigpapi/mqtt/conn.py
  2. 10 5
      mauigpapi/proxy.py
  3. 1 1
      mautrix_instagram/user.py

+ 4 - 4
mauigpapi/mqtt/conn.py

@@ -566,10 +566,10 @@ class AndroidMQTT:
         finally:
         finally:
             self.log.debug(f"Dispatcher loop {loop_id} stopped")
             self.log.debug(f"Dispatcher loop {loop_id} stopped")
 
 
-    async def update_proxy_and_sleep(self, retry):
+    async def update_proxy_and_sleep(self, retry, reason):
         sleep = retry * 2
         sleep = retry * 2
         if retry > 1:
         if retry > 1:
-            if self.proxy_handler and self.proxy_handler.update_proxy_url():
+            if self.proxy_handler and self.proxy_handler.update_proxy_url(reason):
                 self.setup_proxy()
                 self.setup_proxy()
             await self._dispatch(ProxyUpdate())
             await self._dispatch(ProxyUpdate())
         await self._dispatch(
         await self._dispatch(
@@ -622,7 +622,7 @@ class AndroidMQTT:
                 elif rc == pmc.MQTT_ERR_NO_CONN:
                 elif rc == pmc.MQTT_ERR_NO_CONN:
                     if connection_retries > retry_limit:
                     if connection_retries > retry_limit:
                         raise MQTTNotConnected(f"Connection failed {connection_retries} times")
                         raise MQTTNotConnected(f"Connection failed {connection_retries} times")
-                    await self.update_proxy_and_sleep(connection_retries)
+                    await self.update_proxy_and_sleep(connection_retries, "MQTT_ERR_NO_CONN")
                 else:
                 else:
                     err = pmc.error_string(rc)
                     err = pmc.error_string(rc)
                     self.log.error("MQTT Error: %s", err)
                     self.log.error("MQTT Error: %s", err)
@@ -633,7 +633,7 @@ class AndroidMQTT:
                 except MQTTReconnectionError:
                 except MQTTReconnectionError:
                     if connection_retries > retry_limit:
                     if connection_retries > retry_limit:
                         raise
                         raise
-                    await self.update_proxy_and_sleep(connection_retries)
+                    await self.update_proxy_and_sleep(connection_retries, "MQTTReconnectionError")
 
 
                 connection_retries += 1
                 connection_retries += 1
             else:
             else:

+ 10 - 5
mauigpapi/proxy.py

@@ -7,6 +7,7 @@ import logging
 import urllib.request
 import urllib.request
 
 
 from aiohttp import ClientConnectionError
 from aiohttp import ClientConnectionError
+from yarl import URL
 
 
 from mautrix.util.logging import TraceLogger
 from mautrix.util.logging import TraceLogger
 
 
@@ -39,8 +40,10 @@ class ProxyHandler:
     def get_proxy_url_from_api(self) -> str | None:
     def get_proxy_url_from_api(self) -> str | None:
         assert self.api_url is not None
         assert self.api_url is not None
 
 
-        request = urllib.request.Request(self.api_url, method="GET")
-        self.log.debug("Requesting proxy from: %s", self.api_url)
+        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:
         try:
             with urllib.request.urlopen(request) as f:
             with urllib.request.urlopen(request) as f:
@@ -52,12 +55,12 @@ class ProxyHandler:
 
 
         return None
         return None
 
 
-    def update_proxy_url(self) -> bool:
+    def update_proxy_url(self, reason: str | None = None) -> bool:
         old_proxy = self.current_proxy_url
         old_proxy = self.current_proxy_url
         new_proxy = None
         new_proxy = None
 
 
         if self.api_url is not None:
         if self.api_url is not None:
-            new_proxy = self.get_proxy_url_from_api()
+            new_proxy = self.get_proxy_url_from_api(reason)
         else:
         else:
             new_proxy = urllib.request.getproxies().get("http")
             new_proxy = urllib.request.getproxies().get("http")
 
 
@@ -104,5 +107,7 @@ async def proxy_with_retry(
                 wait,
                 wait,
             )
             )
             await asyncio.sleep(wait)
             await asyncio.sleep(wait)
-            if errors > 1 and proxy_handler.update_proxy_url():
+            if errors > 1 and proxy_handler.update_proxy_url(
+                f"{e.__class__.__name__} while trying to {name}"
+            ):
                 await on_proxy_change()
                 await on_proxy_change()

+ 1 - 1
mautrix_instagram/user.py

@@ -640,7 +640,7 @@ class User(DBUser, BaseUser):
 
 
     async def _maybe_update_proxy(self, source: str) -> None:
     async def _maybe_update_proxy(self, source: str) -> None:
         if not self._listen_task:
         if not self._listen_task:
-            self.proxy_handler.update_proxy_url()
+            self.proxy_handler.update_proxy_url(source)
             await self.on_proxy_update()
             await self.on_proxy_update()
         else:
         else:
             self.log.debug(f"Not updating proxy: listen_task is still running? (caller: {source})")
             self.log.debug(f"Not updating proxy: listen_task is still running? (caller: {source})")