只有 download.part 属于本次要请求的同一对象表示时,才使用断点续传。单凭文件名无法确定这一点:源站可能在第一次尝试后已经改了内容。

curl --proxy http://proxy.example:3128 --noproxy '' --connect-timeout 5 --max-time 60 -C - --output download.part http://files.example/test.bin

把两个端点都换成你有权使用的服务。如果是允许使用公共代理的公开文件对比,可从HTTP 代理列表选择 HTTP 端点。-C - 以现有文件大小作为续传起点。要检查目标响应,不能把返回的任何正文都当成缺少的那段字节:

响应含义
206,带 Content-Range确认返回范围就是预期的续传部分。
200服务器可能忽略了 Range,发送了完整表示。
416请求范围无法满足;不要把错误页面追加到文件中。

验证器与 If-Range 有助于避免把变化资源的不同版本拼在一起。在信任最终文件前,应遵循应用对对象表示的处理规则。

Squid 6.13 的 range_offset_limit 控制的是何时为了缓存而从头获取对象,不是客户端能否请求某个范围:

range_offset_limit 0

设为零可避免仅为了填充缓存而额外获取前缀内容。不缓存对象,也仍然可以成功转发有用的范围。对于普通 HTTPS CONNECT,Range 交互在目标 TLS 内部;应读取目标的响应,不能把 Squid 可见的对象缓存策略当成对内部请求的控制。

相关文章