M205: gh-proxy 键绑定断言、外层重试预算判据、UA 版本号来源、下载设置文档更正
- setting/keys/proxy: 新增断言把 KEY_GH_PROXY 常量与 schema 登记绑起来(键名 / Text{max_len:256} / 默认空串)
- addon/online/download: RETRY_ATTEMPTS 与引擎每源次数是两件事(层级相乘、管的失败类型不同),写清判据并用两条编译期断言钉住 3 与 3x3=9 的边界
- presenter/host/addon/http: UA 版本号改为从 CARGO_PKG_VERSION 拼出,补断言钉住版本 == CARGO_PKG_VERSION 且联系方式段不丢
- docs/download-settings: §3.1 四条 CLI 命令都吃设置(update 是自更新路径),§6 补 M11-M13 三条 CLI 变异,§1/§7 里 gh_proxy 已合入的事实
This commit is contained in:
1 parent
4c29cbac3e
commit
d4aa3b23f4
4 files changed
+119
-16
No files matched your search
@@ -26,8 +26,26 @@ use unlucky_core::download::{DownloadRequest, ResourceKind};
|
||||
use super::super::env::HostEnv;
|
||||
|
||||
/// 站点要求的 User-Agent(Modrinth 明文要求带联系方式,否则限流)。
|
||||
pub(super) const USER_AGENT: &str =
|
||||
"Unlucky-Launcher/0.1 (+https://github.com/AskaEth/Unlucky-Launcher)";
|
||||
///
|
||||
/// ## 为什么这条 UA 要单独看
|
||||
///
|
||||
/// 它**只**出现在带 header 的那条路径(`engine.client()` 直发,今天是 CurseForge 的 `X-API-KEY`),
|
||||
/// 而 Modrinth 的请求走 [`get_via_engine`] —— 那条用的是引擎自己的 UA(`EngineConfig::user_agent`)。
|
||||
/// 也就是说进程里同时存在两个 UA 字符串,改一处不会带动另一处。
|
||||
///
|
||||
/// ## 版本号来自 `CARGO_PKG_VERSION`(M205)
|
||||
///
|
||||
/// 此前写死 `Unlucky-Launcher/0.1`,而当时的版本已经是 0.2.3:写死的版本号只会一年一年地落后,而
|
||||
/// Modrinth 按 UA 做限流与「出问题怎么联系你」的登记 —— UA 里说错版本,就是给了错信息。
|
||||
///
|
||||
/// **产品名与联系方式的写法不跟着版本动**:`Unlucky-Launcher/<version> (+<repo URL>)` 这个形状、
|
||||
/// 以及那个 GitHub 地址,是站点侧识别我们、以及知道去哪儿联系的地方;改它是单独的产品决定,不在
|
||||
/// 「版本号来源」这条改动里顺手改(断言 `the_user_agent_carries_the_package_version` 钉住了现状)。
|
||||
pub(super) const USER_AGENT: &str = concat!(
|
||||
"Unlucky-Launcher/",
|
||||
env!("CARGO_PKG_VERSION"),
|
||||
" (+https://github.com/AskaEth/Unlucky-Launcher)"
|
||||
);
|
||||
|
||||
/// 最多重试次数(含首次)。
|
||||
///
|
||||
@@ -149,6 +167,29 @@ mod tests {
|
||||
use super::get;
|
||||
use crate::host::env::HostEnv;
|
||||
|
||||
/// UA 里的版本号必须等于这个 crate 的 `CARGO_PKG_VERSION`(M205)。
|
||||
///
|
||||
/// 为什么不是「编译过就行」:`concat!` 只保证拼得起来,**写死**一个版本号照样编得过 —— 上一版正是
|
||||
/// 这样从 0.1 一路落后到 0.2.3(UA 会发到站点,版本号是站点侧看到的事实)。
|
||||
///
|
||||
/// 抓得住:版本号又写回任何字面量(`0.1` / `0.2` / 与 `CARGO_PKG_VERSION` 不等的任何值)⇒ 红;
|
||||
/// UA 形状被拼歪(少了 `Unlucky-Launcher/` 前缀、`(+<联系方式>)` 那一段被删)⇒ 也红。
|
||||
/// 抓不住:真实 Modrinth 请求下这条 UA 会被怎么限流(单测打不了公网);也抓不住「产品名与联系
|
||||
/// 方式写得对不对」——这里只是钉住现状不许顺手改,不是对站点口径的验证。
|
||||
#[test]
|
||||
fn the_user_agent_carries_the_package_version() {
|
||||
let ua = super::USER_AGENT;
|
||||
let version = ua
|
||||
.strip_prefix("Unlucky-Launcher/")
|
||||
.and_then(|rest| rest.split(' ').next())
|
||||
.expect("UA 形状应为 `Unlucky-Launcher/<version> (<联系方式>)`");
|
||||
assert_eq!(version, env!("CARGO_PKG_VERSION"), "UA: {ua}");
|
||||
assert!(
|
||||
ua.contains("(+https://github.com/AskaEth/Unlucky-Launcher)"),
|
||||
"联系方式那一段是站点要求,不许顺手删:{ua}"
|
||||
);
|
||||
}
|
||||
|
||||
/// 离线回环 HTTP 服务:只答固定 JSON,数「处理了几条请求 / 接了几条连接」。
|
||||
///
|
||||
/// 用 127.0.0.1 而不是真站点:**单测不许打公网**(CI 没网,也不该有)。
|
||||
|
||||
Reference in new issue
Block a user