- From: Yves Lafon <ylafon@w3.org>
- Date: Fri, 23 Jul 2010 08:58:45 -0400 (EDT)
- To: Henrik Nordstrom <henrik@henriknordstrom.net>
- cc: HTTP Working Group <ietf-http-wg@w3.org>
On Fri, 31 Jul 2009, Henrik Nordstrom wrote:
> The recommendation that proxies should only return the requested range
> to the client when receiving a 200 response from the server has a some
> undesired network effects.
>
> The text currently reads:
>
> p5-range
> 5.4.2. Range Retrieval Requests
>
> If a proxy that supports ranges receives a Range request, forwards
> the request to an inbound server, and receives an entire entity in
> reply, it SHOULD only return the requested range to its client. It
> SHOULD store the entire received response in its cache if that is
> consistent with its cache allocation policies.
>
> Proposed change:
>
> Reduce "SHOULD only return" to a MAY level requirement, and remove the
> caching part (covered elsewhere), making the text read
>
> If a proxy that supports ranges receives a Range request, forwards
> the request to an inbound server, and receives an entire entity in
> reply, it MAY return only the requested range to its client.
The text for byte-ranges says:
<<
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 representation, 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
representation.
>>
I don't see why it would be a MAY for a proxy and a SHOULD for a server,
it seems better to keep them both as SHOULDs.
> If a proxy that supports ranges receives a Range request, forwards
> the request to an inbound server, and receives an entire entity in
> reply, it MAY return only the requested range to its client.
>
> And probably this should be restricted to 200 responses, and reminding
> that "supports ranges" also involve processing conditionals as suitable.
>
>
> The intentions of the original text is to optimize the last hop to the
> client, but unfortunately it has some quite noticeable bad effectsand
> often do not make sense to implement as specified (SHOULD).
>
> Some examples:
>
> * A client making a range request for the last 200 bytes of a 8TB
> file. As the response "never" comes the client usually times
> out.
Is it better to transmit the 8TB back to the client? It probably depends
on what the purpose of the proxy is.
> * "download accelerators" accelerating the problem by making many
> Range requests for different parts and as the proxy is masking
> the problem these "download accelerators" have no chance of
> realizing things have gone "bad".
I understand this as "the proxy will get several times the whole request",
which depends on the proxy implementation.
> * Guaranteed extra network load if the resulting object is not
> cachable (or when there is no cache in the proxy). Many times
> the client do really intend to request the rest a little later,
> and if the object is not cached this results in yet another full
> download of the object by the proxy.
Agreed (although same issue as the first *, it may make sense to have the
proxy consume bandwidth on one side to save on the other).
> * Bandwidth allocation policy. It's relatively easy to implement a
> reasonable bandwidth policy by downloading objects at about the
> same rate those can be delivered to the requesting client, but
> far from trivial to select a suitable download rate when only
> spooling the data into cache with no client waiting for the data
> currently received.
>
> We (Squid) originally had Range implemented as specified, but due to
> this frequently causing more bandwidth issues and confusion than it
> helped we changed the implementation many years ago to by default NOT
> implement Range ourselves when getting a 200 response to a forwarded
> Range request, only implementing Range on cached responses.
Which is a perfectly weighed decision, so in sync with the definition of
SHOULD.
> Regarding the "SHOULD store the entity" part this is highly redundant
> with other parts of the specification and do not really add anything to
> be specified here, just confusion making one think that there is
> something special with how 200 responses to a Range request should be
> cached differently from 200 responses to non-Range requests.
I completely agree, striking "It SHOULD store the entire received response
in its cache if that is consistent with its cache allocation policies."
--
Baroula que barouleras, au tiéu toujou t'entourneras.
~~Yves
Received on Friday, 23 July 2010 12:58:47 UTC