Files
gitlab-instance-0a899031_sh/d2ypp2/src/proxy.py
2026-05-16 19:24:30 -05:00

60 lines
1.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import os
from enum import Enum, auto
from dataclasses import dataclass, field
class ProxyType(Enum):
HTTP = auto()
HTTPS = auto()
SOCKS = auto()
@dataclass(frozen=True)
class ProxyInfo:
ip: str = field(default="", repr=True)
port: str = field(default="", repr=True)
def __post_init__(self):
if (self.ip and not self.port) or (not self.ip and self.port):
raise ValueError("IP or port cannot be empty")
if (self.ip and self.port) and (not self.port.isdigit() or not (1 <= int(self.port) <= 65535)):
raise ValueError("Port must be a digit between 1 and 65535")
class ProxyDetector:
"""仅 Linux从环境变量读取代理http_proxy / https_proxy / ftp_proxy"""
def get_proxy_info(self) -> ProxyInfo:
ip, port = self._get_proxy_info_linux()
return ProxyInfo(ip, port)
def is_proxy_enabled(self) -> bool:
return self._is_proxy_enabled_linux()
@staticmethod
def _get_proxy_info_linux() -> tuple[str, str]:
proxies = {
"http": os.getenv("http_proxy"),
"https": os.getenv("https_proxy"),
"ftp": os.getenv("ftp_proxy"),
}
ip = port = ""
for _proto, proxy in proxies.items():
if proxy:
# 支持 http://host:port
p = proxy.strip()
if "://" in p:
p = p.split("://", 1)[1]
if "@" in p:
p = p.split("@", 1)[1]
if ":" in p:
ip, _, port = p.rpartition(":")
port = port.split("/")[0]
break
return ip, port
def _is_proxy_enabled_linux(self) -> bool:
ip, port = self._get_proxy_info_linux()
return bool(ip and port)