范围请求让客户端请求表示的一部分。媒体播放器、可断点续传的下载工具与诊断客户端会用到它,但服务器如果错误地声明或返回范围,就可能产生静默损坏,而不是干净的失败。

建立完整大小

抓取完整表示的响应头,并记录其长度与验证器:

url=https://www.example.test/downloads/archive.tar.gz
curl -sS -D full.headers -o /dev/null "$url"
awk 'tolower($1) ~ /^(content-length:|etag:|last-modified:|accept-ranges:)$/ { print }' full.headers

Accept-Ranges: bytes 是显式信号,但缺少这个头并不能证明范围请求不受支持。去实际请求一次。

请求一个已知区间

请求开头 16 字节,同时保留响应头与正文:

curl -sS -D range.headers -o range.body \
  -H 'Range: bytes=0-15' "$url"

wc -c range.body
awk 'tolower($1) ~ /^(content-range:|content-length:|etag:)$/ || /^HTTP\// { print }' range.headers

成功的字节范围响应应使用 206 Partial ContentContent-Range 应指出 0-15 与完整表示长度,而正文应正好包含 16 个字节。

测试一个不可能的区间

请求超出已知末尾的字节:

curl -sS -D - -o /dev/null \
  -H 'Range: bytes=999999999-' "$url"

对无法满足的字节范围,416 Range Not Satisfiable 加一个类似 bytes */12345Content-Range 值会暴露真实长度。当服务器忽略 Range 时返回 200 也可能合法,但它必须返回完整表示,而不是一个标签错误的片段。

让验证器留在故事里

续传工具可以用 If-Range 配合强验证器或日期。如果表示已改变,安全响应是完整的最新表示,而不是从两个版本拼接出的字节。在宣称某个下载"可续传"之前,先测试这一行为。

来源