Repository navigation
fix(download): 下载链路走 ureq 自带的环境代理 + 补上读写超时 - #84
std-external wants to merge 1 commit into
Conversation
|
本地验证记录(Linux + nightly,复用 其中 跨平台分支的类型检查(这台机器是 Linux,没有 Windows/macOS 真机):把 说明:这只能证明平台分支能过类型检查, 前端这次没有截图: |
|
怎么写这么复杂 ureq自己没有支持系统代理的工具吗 加上就可以了吧 没必要加个单独的设置 |
…ead/write timeouts 下载链路(src-tauri/src/ureq.rs)之前用 ureq 的默认 agent:既不读代理,也没有读写 超时。前端接口走 reqwest(默认吃环境代理)能通,而文件下载是硬直连,于是网络受限时 会出现「接口正常、下载卡住」;即便连上了,ureq 默认没有读超时,服务端不再发数据时 读操作会一直阻塞,既不会报错也不会触发已有的重试。 - 打开 ureq 的 `proxy-from-env`:非回环目标的下载 agent 用 `try_proxy_from_env(true)`,`ALL_PROXY` / `HTTPS_PROXY` / `HTTP_PROXY`(大小写都认) 一个都没配时就是直连,不需要额外的设置项 - 回环地址(localhost / 127.0.0.0/8 / ::1)单独走直连 agent:本机地址不该被代理接管, 而且开了这个 feature 之后 `AgentBuilder::new()` 默认就吃环境代理,必须显式关掉 - 补上 ureq 默认没有的读/写超时(各 30s,连接超时沿用 30s):连接建立后服务端长时间 不发数据时读操作报错,交给已有的断点重试/单连接回退处理,而不是永久卡死 - 同时打开 `socks-proxy`:否则 `ALL_PROXY=socks5://…` 会在连接时报 `SOCKS feature disabled`
23af157 to
70931b3
Compare
|
有道理,已经砍了:自定义设置项、 fn download_agent(url: &str) -> &'static ureq::Agent {
// 非回环目标:.try_proxy_from_env(true)(ALL_PROXY / HTTPS_PROXY / HTTP_PROXY,没配就直连)
// 回环目标:显式 .try_proxy_from_env(false) 的直连 agent
// 两者都补 timeout_read / timeout_write = 30s(ureq 默认没有,这就是卡住不重试那条)
}改动只剩 两个坑顺便说一下:
另外说明一下边界:这只读环境变量,Windows 上 Clash 那种「系统代理」开关(写注册表)覆盖不到, |
背景
社区反馈:接口(weg.fan)请求正常,但 Mod / Everest 文件下载卡住或失败。只读审查(v1.2.1,与 master
d568b5b相同)后有两处能解释:make_request(和download_multi_thread里的 HEAD),用的是 ureq 默认 agent,而Cargo.toml没开proxy-from-env→proxy: None。前端的接口请求走@tauri-apps/plugin-http(reqwest,默认吃环境代理),于是出现「接口走代理、下载硬直连」。grep -c timeout src-tauri/src/ureq.rs= 0,ureq 的默认 agent 是timeout_connect: 30s, timeout_read: None, timeout_write: None。连接建立后服务端不再发数据,reader.read()永远阻塞:不报错、不重试、进度停住;分段模式下handles.join()也因此永不返回。同仓库其它网络路径都设了超时(目录 60s、依赖图 20s)。按 review 意见,不引入自定义设置项和独立的代理模块,直接使用 ureq 自带的
proxy-from-env。改了什么(3 个文件,+82/−4)
src-tauri/Cargo.tomlsrc-tauri/src/ureq.rs:加一个download_agent(url),make_request和分段下载的 HEAD 都改用它。AgentBuilder::new()...try_proxy_from_env(true)——ALL_PROXY/HTTPS_PROXY/HTTP_PROXY(大小写都认),一个都没配就是直连,不需要任何设置项。localhost/127.0.0.0/8/::1):单独走一个显式try_proxy_from_env(false)的直连 agent。两个原因:本机地址不该被代理接管;而且开了proxy-from-env之后AgentBuilder::new()的默认值就是true,不显式关掉的话直连 agent 也会被代理劫持(我本地就是这么被坑到的:测试里的本地 HTTP 服务器收不到请求,全挂在环境代理上,cargo test在有http_proxy的机器上直接卡死)。probe_range探测续传,失败回退单连接,最多 3 次),而不是永久挂住。socks-proxy:不打开的话ALL_PROXY=socks5://…会在连接时报SOCKS feature disabled(比直连失败更难懂)。不想要这个依赖的话去掉这个 feature 即可,socks 0.3.4会从锁文件里消失。验证
新增测试
loopback_targets_skip_the_proxy:127.0.0.1/127.1.2.3/[::1]/localhost走直连,gamebanana.com/192.168.8.1/localhost.example.com/ 非法 URL 不走。既有的断线续传、Range 回退测试继续全绿(它们跑在 127.0.0.1 上,所以也能反过来证明回环直连生效)。环境代理是否真的生效:另写了一个临时测试(未提交)——本地起一个假代理并把
http_proxy/HTTPS_PROXY指向它,然后下载一个非回环 URL,断言代理收到的是GET http://celeste.weg.fan/... HTTP/1.1(绝对 URI 请求行)、并且下载内容来自代理:对没有代理的用户的影响
不设任何代理环境变量、系统也没开代理时:解析结果为空 → 直连,行为与改动前一致;唯一差别是新增的读/写超时。
遗留 / 没验证的点
no_proxy支持(proxy-from-env只做Proxy::try_from_system),只保证回环地址直连。ureq.rs里的常量即可。proxy-from-env之后,ureq 的全局默认 agent 也会读环境代理,也就是说everest.rs的 Mod 目录接口和backend.rs的依赖图(都指向celeste.weg.fan)现在也会走环境代理。这与前端 reqwest 的行为一致,但确实超出了下载链路的范围,如果需要保持它们直连,得在那两处也显式用 agent 构建。useCnProxy那条前端固定传false、后端let _ = use_cn_proxy丢弃的死参数。