Before starting a Range
request, I first check if it is supported using a HEAD request. Normally I get back something like this:
curl -X HEAD -i http://bits.wikimedia.org/images/wikimedia-button.png
HTTP/1.1 200 OK
...
Content-Length: 2426
Accept-Ranges: bytes
...
Is the Content-Length
guaranteed per the HTTP/1.1 specification in this case? I can't find a definitive answer but it seems like I would need to know the Content-Length
before I do a Range
request.
No.
As per any other response with a 200 status code, such a response SHOULD (in the RFC 2119 sense of "SHOULD" which can be summarised as "better have a damn good reason why not, and be able to say what that damn good reason is") include a length (RFC 2616 §14.13) bar a few scenarios in which it is prohibited (§4.4) (in particular, the value must be both the entity and transfer length and as such is only valid when the transfer-encoding is "identity" [the default]). There is no reason why an
Accept-Ranges
header need not be sent along with a chunked and/or compressed transfer-encoding. (Different to compressed content-encoding, in which caserange
, likecontent-length
refers to the compressed size).Some things worth noting:
range
request and respond with the full length, even if it had suggested otherwise. (§14.35.2) Hence, you should always be prepared to receive this.Range
orIf-Range
even if it didn't indicate it would throughAccept-Ranges
. (§14.5)Range
could be e.g.123-
meaning "send me everything from octet 123 on to the end. (§14.35.1)Range
of e.g.123-500
is valid even if the size of the entity is less than 500, in which case as many octets as are available are to be sent. However, it would not be valid if there were fewer than 123 octets in the entire entity. (§14.35.1)bytes
are valid but undefined forAccept-Range
. (§3.12) This means that the server is doing something non-standard, so unlessbytes
is also mentioned, you should interpret it as not including anAccept-Range
.Content-Length
in a response includingAccept-Range
is valid, it's not very likely. As a rule, if you were to treat such responses as if they had not included anAccept-Range
header then you would be safe from mis-steps in the face of such behaviour, while also benefiting from the range behaviour the vast majority of the time it came up.