背景
#49 已经让 HTTP 响应和读取阶段都有硬性边界:下载库即使忽略取消令牌,也不会无限卡住。
但现场测速显示 files.pythonhosted.org 在当前网络约为 51 KB/s。playwright-1.60.0 约 37.9 MiB,即使持续有进展也可能超过单次 15 分钟限时。当前失败清理 staging 后会从零重新下载,不能把“可诊断”误当成“可完成”。
目标
- 保持受控按需下载、逐件 HTTPS 来源白名单和固定 SHA-256;不改用系统 Python、不放开任意镜像或动态依赖解析。
- 在应用专属缓存中仅保留可验证的
.part 片段;按固定 artifact 身份、源和哈希隔离。
- 下一次尝试使用 HTTP Range 续传;只有服务器返回严格匹配的
206 Content-Range 时才追加,否则安全地重新开始。
- 每次完成后重新校验完整长度(若清单有)和 SHA-256;任一不匹配都丢弃片段并给出已脱敏错误。
- 成功解压/安装/激活后删除 Python ZIP、bootstrap、完整 wheel 和
.part 缓存;不把原始压缩包长期留在用户机器。
- 取消、超时、掉线和服务器不支持 Range 时均可安全重试,日志只记录阶段、错误码、文件名/序号和版本。
验收
- 测试覆盖:从已下载前缀以
206 续传、服务器忽略 Range、错误 Content-Range、哈希失败、取消和成功后的清理。
- 续传路径不会把不受信任的旧内容混入最终文件,且不会逃离应用管理缓存。
- 慢速网络在多次有界尝试后能累积完成单个大 wheel,而不是每次从零开始。
- 正常完成的运行时不残留原始下载文件或临时 wheel 目录。
- 不打包 Python 运行时进正式安装器;桥接诊断包仍是独立、临时的排障工具。
背景
#49 已经让 HTTP 响应和读取阶段都有硬性边界:下载库即使忽略取消令牌,也不会无限卡住。
但现场测速显示
files.pythonhosted.org在当前网络约为 51 KB/s。playwright-1.60.0约 37.9 MiB,即使持续有进展也可能超过单次 15 分钟限时。当前失败清理 staging 后会从零重新下载,不能把“可诊断”误当成“可完成”。目标
.part片段;按固定 artifact 身份、源和哈希隔离。206 Content-Range时才追加,否则安全地重新开始。.part缓存;不把原始压缩包长期留在用户机器。验收
206续传、服务器忽略 Range、错误 Content-Range、哈希失败、取消和成功后的清理。