在开始范围请求之前,我首先检查是否使用HEAD请求支持它。通常我会得到这样的东西:
curl -X HEAD -i http://bits.wikimedia.org/images/wikimedia-button.png
HTTP/1.1 200 OK
...
Content-Length: 2426
Accept-Ranges: bytes
...
在这种情况下,每个HTTP / 1.1规范是否保证Content-Length?我找不到确定的答案,但似乎在我做范围请求之前我需要知道Content-Length。
答案 0 :(得分:5)
没有
根据任何其他具有200状态代码的响应,这样的响应应该(在RFC 2119意义上的“应该”,可以概括为“更好”一个该死的好理由,为什么不,并且能够说出该死的好理由是什么?)包括一个长度(RFC2616§14.13)禁止禁止的几个场景(§4.4)(特别是,值必须是两者实体和传输长度,因此仅在传输编码为“identity”[默认]时才有效。没有理由不将Accept-Ranges
标头与分块和/或压缩传输编码一起发送。 (与压缩内容编码不同,在这种情况下range
,如content-length
指的是压缩大小。)
值得注意的一些事情:
range
请求并以全长响应,即使它已另有建议。 (§14.35.2)因此,你应该随时准备接受这个。Range
或If-Range
,即使它没有表明它会通过Accept-Ranges
。 (§14.5)Range
可以是例如123-
意思是“把我从八字节123发送到最后的所有内容。(§14.35.1)Range
即使实体的大小小于500,123-500
也是有效的,在这种情况下,将发送可用的八位字节。但是,如果整个实体中少于123个八位字节,则无效。 (§14.35.1)bytes
以外的值有效,但Accept-Range
未定义。 (§3.12)这意味着服务器正在做一些非标准的事情,所以除非还提到bytes
,否则你应该将其解释为不包括Accept-Range
。Content-Length
的回复中不包括Accept-Range
有效,但不太可能。作为一项规则,如果您将此类响应视为未包含Accept-Range
标题,那么您在面对此类行为时可以避免误操作,同时也可以从范围行为中获益绝大多数它出现的时间。