File size: 2,352 Bytes
c8e5eaa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
"""可信部署地址配置;不依据请求 Host 或转发头构造持久链接。"""
import ipaddress
import os
import re
from urllib.parse import urlsplit, urlunsplit

DEFAULT_PUBLIC_API_BASE_URL = "https://zhiwei666-comfyui-ranking-api.hf.space"
PUBLIC_API_BASE_URL_ENV = "RANKING_PUBLIC_API_BASE_URL"
_CONFIG_ERROR = "RANKING_PUBLIC_API_BASE_URL 配置无效:需要 HTTPS 服务基址,HTTP 仅允许本机回环地址"


def public_api_base_url(environ=None):
    """读取受运维控制的基址;缺失兼容默认,显式错误拒绝初始化。"""
    environ = os.environ if environ is None else environ
    value = environ.get(PUBLIC_API_BASE_URL_ENV, DEFAULT_PUBLIC_API_BASE_URL)
    if (not isinstance(value, str) or not value or len(value) > 2048
            or any(ord(char) <= 32 or ord(char) >= 127 for char in value)
            or "\\" in value):
        raise RuntimeError(_CONFIG_ERROR)
    try:
        parsed = urlsplit(value)
        host = parsed.hostname
        port = parsed.port
        if (parsed.scheme not in {"http", "https"} or not host
                or parsed.username is not None or parsed.password is not None
                or "?" in value or "#" in value
                or (port is not None and not 1 <= port <= 65535)
                or parsed.netloc.endswith(":")):
            raise ValueError()
        try:
            address = ipaddress.ip_address(host)
        except ValueError:
            address = None
            if (len(host) > 253 or not all(re.fullmatch(r"[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?", label)
                    for label in host.split(".")) or re.fullmatch(r"[0-9.]+", host)):
                raise ValueError()
        if parsed.scheme == "http" and not (host == "localhost" or address and address.is_loopback):
            raise ValueError()
        path = parsed.path.rstrip("/")
        if (path and (not path.startswith("/") or "//" in path
                or not re.fullmatch(r"/[A-Za-z0-9._~/-]+", path)
                or any(segment in {".", ".."} for segment in path.split("/")))):
            raise ValueError()
        return urlunsplit((parsed.scheme, parsed.netloc.lower(), path, "", ""))
    except ValueError:
        raise RuntimeError(_CONFIG_ERROR) from None


PUBLIC_API_BASE_URL = public_api_base_url()