- From: Jeffrey Mogul <mogul@pa.dec.com>
- Date: Tue, 04 Nov 97 13:47:18 PST
- To: http working group <http-wg%cuckoo.hpl.hp.com@hplb.hpl.hp.com>
John Franks writes: If a server receives a byte range requests for a 100 byte file like a) Range: bytes = 0-10, 130-140 or b) Range: bytes = 30-20 or c) Range: bytes = 0-10, 30-20, 40-50 what is the correct response? In case a) one of the two ranges is invalid, but the spec says send a 416 only if *all* are invalid. If the valid ones are returned with a 206 then there is no way to signal an error. In case b) the spec says If the last-byte-pos value is present, it must be greater than or equal to the first-byte-pos in that byte-range-spec, or the byte-range-spec is invalid. The recipient of an invalid byte-range-spec must ignore it. If the server ignores it then it should send what? Case c) is like b) except it is possible to send the valid ranges. I think the confusion here arises because, when I drafted this part of the spec, I failed to make a clear distinction between "syntactically invalid" byte-range-specs, and what I probably should have called "unsatisfiable" byte-range-specs. A "syntactically invalid" byte-range-spec is one for which there are no circumstances in which it would ever be valid. E.g., "bytes = 30-20" and "bytes = 10-20-30" are both syntactically invalid byte-range-specs. Basically, this is a coding bug in the client. An "unsatisfiable" byte-range-spec is one that is syntactically valid, but which cannot be satisfied (even partially) given the current state of the resource. The fact that the client made such an unsatisfiable request might not be the result of a coding bug; it might just be because the client's information about the resource's current length is either out-of-date or "optimistic". Note that some of this terminology already appears in section 14.17, but it isn't used consistently in the entire document. The philosophy behind the entire byte-range design is that requests that have "syntactically invalid" byte-range-specs should be treated as buggy, and the server should simply ignore the Range header and treat the request just as it would have treated a regular GET without the buggy Range. However, when a request contains a Range header which is syntactically valid, the server should provide as much as it can to the client, consistent with the request. That means that if any of the byte-range-specs are even partially satisfiable, then the server should send a 206 (Partial content) response; if none of the byte-range-specs are satisfiable, then the server should return a 416 response. This is basically an application of the Robustness Principle ("be conservative in what you send, be liberal in what you accept"). I think this also clears up Dave Kristol's concern. Dave wrote: However, I have a problem with section 10.4.17, 416 Requested range not found. The helpful hint, "(For byte-ranges, this means that the first-byte-pos of all of the byte-range-spec values were greater than the current length of the selected resource.)" is incorrect. The byte-range-spec "30-20" (as in (b) above) is invalid, but the first-byte-pos is valid. I think the "helpful hint" is accurate if you treat 416 as meaning "Requested range not satisfiable" rather than "Requested range not valid". Here are my proposed rewrites: (1) Section 10.4.17 416 "Requested range not valid" should be retitled "Requested range not satisfiable", and in section 6.1.1, the BNF for Status-Code should be changed from | "416" ; Requested range not valid to | "416" ; Requested range not satisfiable This name change should also be applied at three places in section 14.17 where this status code is mentioned. (2) In section 14.36.1 Byte Ranges, change If the last-byte-pos value is present, it must be greater than or equal to the first-byte-pos in that byte-range-spec, or the byte-range-spec is invalid. The recipient of an invalid byte-range-spec must ignore it. to If the last-byte-pos value is present, it must be greater than or equal to the first-byte-pos in that byte-range-spec, or the byte-range-spec is syntactically invalid. The recipient of a byte-range-set that includes one or more syntactically invalid byte-range-spec values MUST ignore the header field that includes that byte-range-set. (3) Also in section 14.36.1 Byte Ranges, before the paragraph that starts "Examples of byte-ranges-specifier values ...", insert this paragraph: If a syntactically valid byte-range-set includes at least one byte-range-spec whose first-byte-pos is less than the current length of the entity-body, or at least one suffix-byte-range-spec with a non-zero suffix-length, then the byte-range-set is satisfiable. Otherwise, the byte-range-set is unsatisfiable. If the byte-range-set is unsatisfiable, the server SHOULD return a response with a status of 416 (Requested range not satisfiable). Otherwise, the server SHOULD return a response with a status of 206 (Partial Content) containing the satisfiable ranges of the entity-body. -Jeff
Received on Tuesday, 4 November 1997 13:53:29 UTC