- From: Yves Lafon <ylafon@w3.org>
- Date: Mon, 1 Aug 2011 09:03:39 -0400 (EDT)
- To: Willy Tarreau <w@1wt.eu>
- cc: Brian Pane <brianp@brianp.net>, "ietf-http-wg@w3.org" <ietf-http-wg@w3.org>
On Sat, 30 Jul 2011, Willy Tarreau wrote:
> On Fri, Jul 29, 2011 at 12:11:20AM -0700, Brian Pane wrote:
>> If it's a weak ETag, then it's okay to use the same ETag value even if
>> two applications of compression yield outputs that aren't bytewise
>> equal. If it's a strong ETag, like you'd need in order to support
>> If-None-Match or If-Range, then yes, the generated ETag would be wrong
>> in this situation; however... what's the use case in which two runs of
>> gzip, both starting with freshly initialized state (as is the case
>> when gzip is invoked dynamically on a per-response basis in every
>> server and proxy implementation I've seen), will produce different
>> output from the same input? I can only think of a couple of ways to
>> cause the output to differ while still producing a response the client
>> can uncompress:
>> - Change gzip's compression level between the two runs, or
>> - Swap in a different compression implementation (that produces
>> different but still valid gzip-formatted output) between the two runs.
>> Neither of those is impossible, but I don't imagine that they're
>> common cases either. Am I missing any other use case?
>
> Well, even worse, a server (or an intermediary) might dynamically adjust
> its compression level depending on CPU usage, which means that a single
> compressed stream might be built from different compression levels.
As always, compression at the "connection" level (aka
TE/Transfer-Encoding) won't suffer the issue of having to weaken the ETag
or create different strong ETag per compression level/dictionnary update,
needing to change Vary etc... but it's not that much implemented as it is
hop-by-hop and not end-to-end (curl implemented it recently, thanks!)
For Willy, see also the warning '214 Transformation applied'. [1] when
compression is done at the representation level at an intermediary.
To get back at the original question, If-Range can be applied only using a
strong validator, meaning that it needs to be the exact same
representation (something that on-the-fly compression can provide, of
course but only if clearly set validators, content-*, but being
compressed is a property of the representation in that case, and the
range request applies to bytes of the representation, so in your case
something compressed).
[1] http://tools.ietf.org/html/draft-ietf-httpbis-p6-cache-15#section-3.6
--
Baroula que barouleras, au tiéu toujou t'entourneras.
~~Yves
Received on Monday, 1 August 2011 13:03:44 UTC