diff --git a/lite/proxy_lite.py b/lite/proxy_lite.py index a2c8b4a..8e2afc7 100644 --- a/lite/proxy_lite.py +++ b/lite/proxy_lite.py @@ -590,6 +590,17 @@ def _set_local_port(port): _settings_save(data) log(f"代理转发端口已保存: {port}(下次开启代理生效)") +def _update_via_proxy(): + """更新检查/下载是否走节点隧道(CONNECT);设置项,默认关=直连仓库。""" + return bool(_settings_load().get("update_via_proxy", False)) + +def _set_update_via_proxy(enabled): + """写回「使用代理更新」设置(立即生效)。""" + data = _settings_load() + data["update_via_proxy"] = bool(enabled) + _settings_save(data) + log(f"更新方式已设为: {'走代理隧道' if enabled else '直连仓库'}") + def _ver_tuple(v): """版本号转数字元组:'v0.1.0' -> (0, 1, 0),无法解析的段按 0 处理。""" parts = [] @@ -1390,7 +1401,7 @@ class SettingsDialog(QDialog): super().__init__(parent) self.setWindowTitle("设置") self.setWindowIcon(load_icon()) - self.setFixedSize(300, 230) + self.setFixedSize(300, 260) self.setStyleSheet(f""" QDialog {{ background-color: {C_BG}; }} QLabel {{ color: {C_TEXT}; font-family: "Microsoft YaHei", "Segoe UI", sans-serif; font-size: 12px; }} @@ -1427,6 +1438,13 @@ class SettingsDialog(QDialog): port_row.addWidget(self.ed_port) layout.addLayout(port_row) + # 更新方式:是否走节点隧道(默认关 = 直连仓库) + self.cb_update_proxy = QCheckBox("使用代理更新") + self.cb_update_proxy.setChecked(_update_via_proxy()) + self.cb_update_proxy.setToolTip("开启后检查更新与下载走节点隧道(CONNECT);默认直连仓库") + self.cb_update_proxy.setStyleSheet(f"color: {C_SUBTEXT}; font-size: 12px;") + layout.addWidget(self.cb_update_proxy) + layout.addStretch() # 提示语:按钮上方居中 @@ -1475,6 +1493,7 @@ class SettingsDialog(QDialog): self.lb_hint.setStyleSheet(f"color: {C_RED}; font-size: 11px;") return _set_local_port(port) + _set_update_via_proxy(bool(self.cb_update_proxy.isChecked())) self.ed_port.setText(str(port)) self.lb_hint.setText(f"已保存: {port},下次开启代理生效") self.lb_hint.setStyleSheet(f"color: {C_GREEN}; font-size: 11px;") @@ -2032,29 +2051,29 @@ class MainWindow(QWidget): self._latest_version = "" self._download_url = "" try: - import json, urllib.request, base64 - domain = _endpoint_domain() - if domain == "???": - log("更新检查: 未配置节点(nodes.json 域名为空),跳过") - return + import json, urllib.request # 基于 Gitea 仓库 releases API 检查更新;config.json 无 update_url 时用默认地址 url = str(_config_val("update_url", "") or "").strip() if not url: url = ("https://git.bu4.ren/api/v1/repos/RoyirinRosmontis/" "Private-Proxy/releases/latest") log("正在检查更新...") - # 显式走本地转发器隧道,不依赖系统代理状态:默认 opener 读注册表代理设置 - # (异常退出残留 127.0.0.1 代理 -> 连接被拒),不识别 PAC 的 AutoConfigURL, - # 直连服务器还可能被墙干扰 TLS 握手(SSL UNEXPECTED_EOF) - started_here = _ensure_forwarder() - try: - opener = urllib.request.build_opener(urllib.request.ProxyHandler( - {"http": f"{PROXY_HOST}:{PROXY_PORT}", - "https": f"{PROXY_HOST}:{PROXY_PORT}"})) + if _update_via_proxy(): + # 走节点隧道(CONNECT,设置「使用代理更新」开启时);显式代理避免残留干扰 + started_here = _ensure_forwarder() + try: + opener = urllib.request.build_opener(urllib.request.ProxyHandler( + {"http": f"{PROXY_HOST}:{PROXY_PORT}", + "https": f"{PROXY_HOST}:{PROXY_PORT}"})) + req = urllib.request.Request(url) + data = opener.open(req, timeout=20).read().decode("utf-8-sig") + finally: + _release_forwarder(started_here) + else: + # 默认直连仓库;显式空代理避免系统/环境残留代理干扰 + opener = _pac_no_proxy_opener() req = urllib.request.Request(url) data = opener.open(req, timeout=20).read().decode("utf-8-sig") - finally: - _release_forwarder(started_here) info = json.loads(data) # 基于 Gitea 仓库 releases API:版本取 tag_name,下载取 exe 附件链接 self._latest_version = str(info.get("tag_name") or "") @@ -2097,18 +2116,25 @@ class MainWindow(QWidget): log(f"正在下载新版本: {url}") log(f"保存到: {save_path}") - # 同更新检查:显式走本地转发器隧道,不依赖系统代理状态 - started_here = _ensure_forwarder() - try: - opener = urllib.request.build_opener(urllib.request.ProxyHandler( - {"http": f"{PROXY_HOST}:{PROXY_PORT}", - "https": f"{PROXY_HOST}:{PROXY_PORT}"})) + # 同更新检查:按「使用代理更新」设置选择隧道或直连 + if _update_via_proxy(): + started_here = _ensure_forwarder() + try: + opener = urllib.request.build_opener(urllib.request.ProxyHandler( + {"http": f"{PROXY_HOST}:{PROXY_PORT}", + "https": f"{PROXY_HOST}:{PROXY_PORT}"})) + req = urllib.request.Request(url) + + with opener.open(req, timeout=120) as resp: + data = resp.read() + finally: + _release_forwarder(started_here) + else: + opener = _pac_no_proxy_opener() req = urllib.request.Request(url) with opener.open(req, timeout=120) as resp: data = resp.read() - finally: - _release_forwarder(started_here) if len(data) < 1024: self._update_download_done.emit(False, "下载文件过小,可能不是有效的 EXE")