> Am 09.04.2019 um 18:48 schrieb Roy T. Fielding <field...@gbiv.com>:
> 
>> 
>> 2. Validation responses lose the "Vary" header from the unconditional 
>> response. This happens on resources where mod_deflate is active.
>>  The 200 response without any "if-modified-since" etc. carries "Vary: 
>> Accept-Encoding" as it should.
>>  The 304 response with "if-modified-since" has no "Vary" header.
>>  The code in mod_deflate looks as if it tries to add it in any case, where 
>> is it lost?
> 
> That's one of many bugs related to design problems with mod_deflate.  
> Basically,
> it chooses to insert itself into the response handling after the other checks 
> are done,
> which means a 304 doesn't even know yet whether the response would use gzip.
> The solution (which I never found time to implement) is to replace dynamic 
> gzip with
> a transfer encoding generator, and/or to rewrite the mod_deflate CE encoder 
> to act more
> like mod_cache.

Thinking out loud here:

Acting more like mod_cache would then split the deflate output filter into a 
resource and a protocol type one, I assume?

The protocol one would
a. check if its resource counterpart was active
b. or, if the requests status is 304, if it would have been active
add "Vary: Accept-Encoding" if one of those is true

For b. a bit of heuristic seems necessary:
- detect that the resource filter has been added before *)
- assume it applies when content-length is not set
- check content-length otherwise
- perform the other (r->subprocess_env etc.) checks as in resource filter


*) It could detect the resource filter in r->output_filters, however 
ap_send_error_respons() overwrites this with r->proto_output_filters. Seems 
like a good idea to save them for later inspection?


-Stefan

Reply via email to