67 lines
1.7 KiB
Python
67 lines
1.7 KiB
Python
"""Proxy helpers for CPA/OIDC export."""
|
|
|
|
import os
|
|
import threading
|
|
import urllib.parse
|
|
|
|
|
|
_tls = threading.local()
|
|
|
|
|
|
def set_runtime_proxy(proxy):
|
|
value = str(proxy or "").strip()
|
|
_tls.proxy = value or None
|
|
|
|
|
|
def get_runtime_proxy():
|
|
return getattr(_tls, "proxy", None)
|
|
|
|
|
|
def resolve_proxy(explicit=None):
|
|
for candidate in (
|
|
str(explicit or "").strip(),
|
|
str(get_runtime_proxy() or "").strip(),
|
|
str(os.environ.get("https_proxy") or "").strip(),
|
|
str(os.environ.get("HTTPS_PROXY") or "").strip(),
|
|
str(os.environ.get("http_proxy") or "").strip(),
|
|
str(os.environ.get("HTTP_PROXY") or "").strip(),
|
|
):
|
|
if candidate:
|
|
return candidate
|
|
return ""
|
|
|
|
|
|
def proxy_for_chromium(proxy):
|
|
raw = str(proxy or "").strip()
|
|
if not raw:
|
|
return ""
|
|
if "://" not in raw:
|
|
raw = "http://" + raw
|
|
try:
|
|
parsed = urllib.parse.urlsplit(raw)
|
|
except Exception:
|
|
return ""
|
|
host = parsed.hostname or ""
|
|
if not host:
|
|
return ""
|
|
port = parsed.port or (443 if (parsed.scheme or "http").lower() == "https" else 80)
|
|
scheme = parsed.scheme or "http"
|
|
return "%s://%s:%s" % (scheme, host, port)
|
|
|
|
|
|
def proxy_log_label(proxy):
|
|
raw = str(proxy or "").strip()
|
|
if not raw:
|
|
return ""
|
|
if "://" not in raw:
|
|
raw = "http://" + raw
|
|
try:
|
|
parsed = urllib.parse.urlsplit(raw)
|
|
except Exception:
|
|
return "(proxy)"
|
|
host = parsed.hostname or "?"
|
|
port = parsed.port
|
|
auth = "user:***@" if parsed.username else ""
|
|
suffix = ":%s" % port if port else ""
|
|
return "%s://%s%s%s" % (parsed.scheme or "http", auth, host, suffix)
|