Skip to content

fix(offline_download): handle unknown-size offline download tasks#2622

Open
kobe-koto wants to merge 2 commits into
OpenListTeam:mainfrom
kobe-koto:main
Open

fix(offline_download): handle unknown-size offline download tasks#2622
kobe-koto wants to merge 2 commits into
OpenListTeam:mainfrom
kobe-koto:main

Conversation

@kobe-koto

@kobe-koto kobe-koto commented Jun 15, 2026

Copy link
Copy Markdown

Summary / 摘要

  • 修复 Aria2/qBittorrent 在 total_bytes = 0 时计算出非有限进度,导致任务接口 JSON 编码失败并返回空 body 的问题。

  • 修复 SimpleHttp 普通下载在响应缺少 Content-Length 时,任务完成后不返回 total_bytes、进度不显示 100% 的问题。

  • 修复 Download stream direct upload 模式下远端大小未知时,上传完成后未把实际大小回填到 transfer task 和父 offline download task的问题。

  • 在任务 API 响应层兜底清理 Inf progress,避免单个异常任务影响整个任务列表接口。

  • This PR has breaking changes.
    / 此 PR 包含破坏性变更。

  • This PR changes public API, config, storage format, or migration behavior.
    / 此 PR 修改了公开 API、配置、存储格式或迁移行为。

  • This PR requires corresponding changes in related repositories.
    / 此 PR 需要关联仓库同步修改。

Testing / 测试

  • go test ./...
  • Manual test / 手动测试:
    在 Web 前端使用 Aria2 和 Simple HTTP (Download stream direct upload 和其他任意 policy) 作为后端下载一不返回 HEAD 或 HEAD 中不返回有效 Content-Length 的链接,在 /@manage/tasks/offline_download 中观察是否能渲染正在下载中的任务,以及下载完成后该任务是否返回有效 total bytes.

Checklist / 检查清单

  • I have read CONTRIBUTING.
    / 我已阅读 CONTRIBUTING
  • I confirm this contribution follows the repository license, contribution policy, and code of conduct.
    / 我确认此贡献符合仓库许可证、贡献规范和行为准则。
  • I have formatted the changed code with gofmt, go fmt, or prettier where applicable.
    / 我已按适用情况使用 gofmtgo fmtprettier 格式化变更代码。
  • I have requested review from relevant maintainers or code owners where applicable.
    / 我已在适用情况下请求相关维护者或代码所有者审查。

AI Disclosure / AI 使用声明

  • This PR includes AI-assisted content.
    / 此 PR 包含 AI 辅助内容。

Tools used / 使用工具:

  • ChatGPT
  • Codex
  • GitHub Copilot
  • Claude
  • Gemini
  • Other (please specify) / 其他(请注明):

Usage scope / 使用范围:

  • Code generation / 代码生成
  • Refactoring / 重构
  • Documentation / 文档
  • Tests / 测试
  • Translation / 翻译
  • Review assistance / 审查辅助
  • I have reviewed and validated all AI-assisted content included in this PR.
    / 我已审核并验证此 PR 中的所有 AI 辅助内容。
  • I have ensured that all AI-assisted commits include Co-Authored-By attribution.
    / 我已确保所有 AI 辅助提交都包含 Co-Authored-By 归属信息。
  • I can reproduce all AI-assisted content included in this PR without any AI tools.
    / 我可以在没有任何 AI 工具的情况下重现此 PR 中包含的所有 AI 辅助内容。

@jyxjjj jyxjjj added the invalid Invalid Content/Cannot Reproduce label Jun 15, 2026
@jyxjjj

jyxjjj commented Jun 15, 2026

Copy link
Copy Markdown
Member

模板

@jyxjjj jyxjjj marked this pull request as draft June 15, 2026 23:32
@kobe-koto kobe-koto changed the title fix: handle unknown-size offline download tasks fix(offline_download): handle unknown-size offline download tasks Jun 16, 2026
@kobe-koto

Copy link
Copy Markdown
Author

已按模板更新 pr body 和标题

@kobe-koto kobe-koto marked this pull request as ready for review June 17, 2026 05:04
@xrgzs xrgzs added Module: Task Task, scheduling and other goroutine-based features related and removed invalid Invalid Content/Cannot Reproduce labels Jun 17, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR hardens offline download/transfer task reporting when the remote file size is unknown (or reported as total_bytes = 0), preventing non-finite progress values from breaking task APIs, and backfilling final sizes/progress on completion for stream-direct-upload flows.

Changes:

  • Prevent NaN/Inf progress values from propagating into task API JSON responses.
  • Avoid division-by-zero progress calculations for Aria2/qBittorrent when total size is unknown; force progress=100 on completed states.
  • Improve unknown-size handling for SimpleHttp and stream-direct-upload transfers, including backfilling total_bytes to the transfer task and its parent task.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
server/handles/task.go Sanitizes non-finite progress values before serializing task info to JSON.
internal/offline_download/tool/transfer.go Improves stream-direct-upload transfer behavior for unknown sizes; propagates final size/progress to parent.
internal/offline_download/tool/download.go Wires parent download task into transfer task so final size/progress can be reflected upstream.
internal/offline_download/qbit/qbit.go Guards progress calculation when size is zero/unknown; sets progress to 100% when completed.
internal/offline_download/http/client.go Handles missing/invalid Content-Length for SimpleHttp, including setting final total bytes after download.
internal/offline_download/aria2/aria2.go Guards progress calculation when total is zero/unknown; sets progress to 100% when completed/seeding.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +83 to +88
if downloadSize < 0 {
if _, err := s.CacheFullAndWriter(nil, nil); err != nil {
return err
}
t.setKnownSize(s.GetSize())
}
Comment on lines +83 to +88
if fileSize <= 0 {
start, end, err := http_range.ParseContentRange(resp.Header.Get("Content-Range"))
if err == nil && end >= start {
fileSize = end - start + 1
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Module: Task Task, scheduling and other goroutine-based features related

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants