Skip to content

feat: 支持使用服务器提供的文件时间#46

Open
doraemonkeys wants to merge 1 commit into
zerx-lab:mainfrom
doraemonkeys:feat/use-server-time
Open

feat: 支持使用服务器提供的文件时间#46
doraemonkeys wants to merge 1 commit into
zerx-lab:mainfrom
doraemonkeys:feat/use-server-time

Conversation

@doraemonkeys

Copy link
Copy Markdown
Contributor

Closes #45

做了什么

新增设置「使用服务器文件时间」(默认关闭):开启后,下载完成的文件会把修改时间设为服务器响应的 Last-Modified 原始时间,而不是下载完成时间。行为与 aria2 的 --remote-time 对齐,方便按文件时间管理版本的用户。

实现要点

  • 引擎Last-Modified 此前已作为续传一致性 validator 被捕获和持久化,本 PR 直接复用该值——在 finalize rename 之后设置文件 mtime(downloader.rs)。时间戳属于尽力而为的元数据:服务器未提供、解析失败或写入失败都只记日志,绝不影响下载结果。
  • HTTP 日期解析:覆盖 RFC 9110 允许的三种格式(IMF-fixdate / 过时 RFC 850 / asctime),复用现有 chrono 依赖,零新增依赖。解析前剥离星期字段——现实中偶见服务器生成的星期与日期不符,严格校验会整体拒绝可用时间戳(与 curl 行为一致)。
  • 配置管道:config key use_server_time,桌面 App 与 headless server 双侧支持启动加载 + 运行时热更新。
  • aria2 RPC 兼容:全局选项 remote-time 映射到该配置,AriaNg 等客户端可直接读写。
  • UI:设置页「下载」分类新增开关,含设置搜索索引与中英文案。

测试

  • 单元测试:三种 HTTP 日期格式解析、错误星期的宽松解析、非法输入/纪元前时间拒绝、aria2 选项映射合法与非法值
  • 集成测试(realtest):开启时文件 mtime 精确等于服务器 Last-Modified,关闭时保持本地完成时间
  • 存量回归全部通过(engine 549 / api 160 / hub),cargo fmt + clippy -D warnings 干净,flutter analyze 无新增告警

范围外(可后续增量)

  • FTP 经 MDTM 命令获取远端时间(FTP 路径目前不填 last_modified,自然跳过,不受影响)
  • hint 模式(浏览器扩展跳过 probe 的一次性 URL)下从首个 206 响应 latch 并持久化 validator
  • Windows 创建时间:与 aria2 对齐仅设置修改时间;若期望同时设置创建时间,可在 issue 中进一步讨论

新增设置 use_server_time(默认关闭):开启后完成文件的 mtime 设为服务器
提供的原始时间。HTTP 日期解析覆盖 RFC 9110 三种格式并剥离星期字段(容忍
服务器星期与日期不符);元数据写入尽力而为,失败仅记日志不影响下载结果。
配置管道覆盖桌面 App 与 headless server(启动加载 + 热更新),aria2 RPC
映射 remote-time 全局选项,设置页「下载」分类新增开关。

Closes zerx-lab#45
@doraemonkeys doraemonkeys force-pushed the feat/use-server-time branch from 5002251 to 066f73d Compare July 10, 2026 10:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

✨ [Feature] 支持使用服务器提供的文件创建时间

1 participant