pcs 97/08/23 07:20:36
Modified: src/modules/standard mod_negotiation.c Log: mod_negotiation marks *all* responses (HTTP/1.0) browsers and proxies caching one variant which may not be the correct one for subsequent requests. The issue is that if you are using mod_negotiation in a trivial way to map (say) requests for index onto index.html *with no other variants*, Apache makes your responses non-cacheable when they probably are safely cacheable. This patch makes responses from mod_negotiation cacheable in the following circumstances: * Variants are found by multiviews (i.e. looking on the disk, rather than reading a .var file) AND * there was only one matching variant found on disk AND * request version is HTTP/1.0 or earlier Reviewed By: Roy Fielding, Dean Gaudet Revision Changes Path 1.55 +9 -1 apachen/src/modules/standard/mod_negotiation.c Index: mod_negotiation.c =================================================================== RCS file: /export/home/cvs/apachen/src/modules/standard/mod_negotiation.c,v retrieving revision 1.54 retrieving revision 1.55 diff -u -r1.54 -r1.55 --- mod_negotiation.c 1997/08/18 13:12:16 1.54 +++ mod_negotiation.c 1997/08/23 14:20:35 1.55 @@ -227,6 +227,8 @@ array_header *accept_langs; /* accept_recs */ array_header *avail_vars; /* available variants */ + int count_multiviews_variants; /* number of variants found on disk */ + int ua_can_negotiate; /* 1 if ua can do transparent negotiate */ int use_transparent_neg; /* 1 if we are using transparent neg */ int short_accept_headers; /* 1 if ua does trans neg & sent short accpt */ @@ -649,6 +651,9 @@ char buffer[MAX_STRING_LEN]; enum header_state hstate; struct var_rec mime_info; + + /* We are not using multiviews */ + neg->count_multiviews_variants = 0; if (rr->status != HTTP_OK) { return rr->status; @@ -809,6 +814,8 @@ new_var = push_array (neg->avail_vars); memcpy (new_var, (void *)&mime_info, sizeof (var_rec)); + + neg->count_multiviews_variants++; clean_var_rec(&mime_info); } @@ -1994,7 +2001,8 @@ /* Otherwise, use it. */ - if (!do_cache_negotiated_docs(r->server) && (r->proto_num < 1001)) + if ((!do_cache_negotiated_docs(r->server) && (r->proto_num < 1001)) + && neg->count_multiviews_variants != 1) r->no_cache = 1; if (na_result == na_not_applied)