跳转到内容

传输特性

本文基于当前代码实现(src/handlers/docker.gosrc/handlers/github.go),说明各场景的传输行为。

HubProxy 通过 go-containerregistry 向上游拉取 manifest 与 blob,再以 HTTP 响应形式返回客户端。

能力 支持 说明
Manifest 缓存 GET manifest 可缓存;digest 24h,latest 等 10 分钟
Token 缓存 上游 expires_in 驱动
多 Registry 路径 example.com/ghcr.io/owner/image:tag
containerd ns 参数 识别 [registries] 中的 registry
认证 realm 改写 上游 token 地址改写到 HubProxy /token
HTTP Range / layer 内续传 blob 始终整层读取后转发,不读取客户端 Range
layer 级重试 Docker/containerd 拉取失败会重试整个 layer
  • blob 非透明透传,由 HubProxy 从上游完整拉取后再 io.Copy 转发
  • 不支持 PATCH/PUT 上传(仅拉取)
  • HEAD / GET manifest 支持

GitHub 代理(proxyGitHubWithRedirect)会将客户端全部请求头(含 Range)转发上游,并将上游状态码与响应头(含 Content-RangeAccept-Ranges)原样返回,再流式转发 body。

能力 支持 说明
流式转发 普通文件直接 io.Copy
HTTP Range / 断点续传 wget -ccurl -C - 可用;上游返回 206 时原样透传
多连接 Range 分片 aria2 等多线程分片下载可用(依赖上游支持 Range)
重定向跟随 最多 20 次;GitHub URL 的 Location 自动改写
网页类型拦截 text/html 等返回 403
文件大小限制 [server].fileSize,默认 2GB(按响应头 Content-Length 校验)
.sh / .ps1 脚本改写 ⚠️ 脚本会完整下载并改写内容后 chunked 输出,不支持 Range 续传
Terminal window
# 首次下载(中断后可续传)
wget -c "https://example.com/https://github.com/owner/repo/releases/download/v1.0.0/large.bin"

实现位置:src/handlers/github.go 第 113–118 行(转发请求头)、第 209–231 行(透传响应)。

能力 支持
流式打包 tar
一次性 token(2 分钟)
Range / 断点续传
Cache-Control: no-store