proxy.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from __future__ import annotations
  2. import json
  3. import logging
  4. import urllib.request
  5. class ProxyHandler:
  6. current_proxy_url: str | None = None
  7. log = logging.getLogger("mauigpapi.proxy")
  8. def __init__(self, api_url: str | None) -> None:
  9. self.api_url = api_url
  10. def get_proxy_url_from_api(self) -> str | None:
  11. assert self.api_url is not None
  12. request = urllib.request.Request(self.api_url, method="GET")
  13. self.log.debug("Requesting proxy from: %s", self.api_url)
  14. try:
  15. with urllib.request.urlopen(request) as f:
  16. response = json.loads(f.read().decode())
  17. except Exception:
  18. self.log.exception("Failed to retrieve proxy from API")
  19. else:
  20. return response["proxy_url"]
  21. return None
  22. def update_proxy_url(self) -> bool:
  23. old_proxy = self.current_proxy_url
  24. new_proxy = None
  25. if self.api_url is not None:
  26. new_proxy = self.get_proxy_url_from_api()
  27. else:
  28. new_proxy = urllib.request.getproxies().get("http")
  29. if old_proxy != new_proxy:
  30. self.log.debug("Set new proxy URL: %s", new_proxy)
  31. self.current_proxy_url = new_proxy
  32. return True
  33. self.log.debug("Got same proxy URL: %s", new_proxy)
  34. return False
  35. def get_proxy_url(self) -> str | None:
  36. if not self.current_proxy_url:
  37. self.update_proxy_url()
  38. return self.current_proxy_url