Return-Path: Delivered-To: apache-cvs-archive@hyperreal.org Received: (qmail 29381 invoked by uid 6000); 28 Jul 1999 17:37:25 -0000 Received: (qmail 29371 invoked by alias); 28 Jul 1999 17:37:23 -0000 Delivered-To: apache-1.3-cvs@hyperreal.org Received: (qmail 29368 invoked by uid 161); 28 Jul 1999 17:37:23 -0000 Date: 28 Jul 1999 17:37:23 -0000 Message-ID: <19990728173723.29367.qmail@hyperreal.org> From: coar@hyperreal.org To: apache-1.3-cvs@hyperreal.org Subject: cvs commit: apache-1.3/src/support httpd.exp Sender: apache-cvs-owner@apache.org Precedence: bulk Reply-To: new-httpd@apache.org coar 99/07/28 10:37:22 Modified: . STATUS src CHANGES src/include alloc.h src/main alloc.c src/modules/standard mod_headers.c mod_negotiation.c mod_rewrite.c src/support httpd.exp Log: Treat the Vary response header field specially; change the modules that touch it to use a new routine that only adds a token if it isn't already present. O(n^2) behaviour as Dean points out, but absent set/atom operations it seems a reasonable stopgap for 1.3.7. PR: 4118 (previously closed with 'use "force-no-vary"') Reviewed by: Ken Coar Revision Changes Path 1.727 +1 -8 apache-1.3/STATUS Index: STATUS =================================================================== RCS file: /home/cvs/apache-1.3/STATUS,v retrieving revision 1.726 retrieving revision 1.727 diff -u -r1.726 -r1.727 --- STATUS 1999/07/28 14:06:20 1.726 +++ STATUS 1999/07/28 17:37:05 1.727 @@ -1,5 +1,5 @@ 1.3 STATUS: - Last modified at [$Date: 1999/07/28 14:06:20 $] + Last modified at [$Date: 1999/07/28 17:37:05 $] Release: @@ -67,13 +67,6 @@ RELEASE SHOWSTOPPERS: - * The Vary header field stuff is still broken (multiple - entries occur, etc.). The result is that some browsers (AFAIK at least - MSIE) are horribly confused by the responses. - Status: It should be fixed before 1.3.7 went out. For details - how it should be done, please look at new-httpd mailing list - archive: Ken, Ralf and Roy have already found consensus in the - past there. RELEASE NON-SHOWSTOPPERS BUT WOULD BE REAL NICE TO WRAP THESE UP: 1.1400 +7 -0 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.1399 retrieving revision 1.1400 diff -u -r1.1399 -r1.1400 --- CHANGES 1999/07/24 18:48:20 1.1399 +++ CHANGES 1999/07/28 17:37:09 1.1400 @@ -1,5 +1,12 @@ Changes with Apache 1.3.7 + *) Sanitise "Vary" values by not adding duplicate keywords. A + separate routine needs to be used to do this, so any module + that frobs "Vary" needs to be changed. The standard modules + have all been modified. This solution is somewhat inelegant, + but it does the job for now. PR#4118 (better fix than before) + [Ken Coar, Roy Fielding] + *) Link DSO's with "gcc -shared" instead of "ld -Bshareable" at least on Linux and FreeBSD for now. [Rasmus Lerdorf] 1.69 +4 -0 apache-1.3/src/include/alloc.h Index: alloc.h =================================================================== RCS file: /home/cvs/apache-1.3/src/include/alloc.h,v retrieving revision 1.68 retrieving revision 1.69 diff -u -r1.68 -r1.69 --- alloc.h 1999/05/13 19:44:14 1.68 +++ alloc.h 1999/07/28 17:37:14 1.69 @@ -225,6 +225,10 @@ API_EXPORT(const char *) ap_table_get(const table *, const char *); API_EXPORT(void) ap_table_set(table *, const char *name, const char *val); API_EXPORT(void) ap_table_setn(table *, const char *name, const char *val); +API_EXPORT(void) ap_table_merge_unique_token(table *t, const char *key, + const char *val); +API_EXPORT(void) ap_table_mergen_unique_token(table *t, const char *key, + const char *val); API_EXPORT(void) ap_table_merge(table *, const char *name, const char *more_val); API_EXPORT(void) ap_table_mergen(table *, const char *name, const char *more_val); API_EXPORT(void) ap_table_unset(table *, const char *key); 1.114 +26 -0 apache-1.3/src/main/alloc.c Index: alloc.c =================================================================== RCS file: /home/cvs/apache-1.3/src/main/alloc.c,v retrieving revision 1.113 retrieving revision 1.114 diff -u -r1.113 -r1.114 --- alloc.c 1999/05/25 15:32:54 1.113 +++ alloc.c 1999/07/28 17:37:16 1.114 @@ -1346,6 +1346,32 @@ } } +/* + * Merge an HTTP token into a table entry IFF it isn't already in there. + * (Intended primarily to avoid "Vary: host, host".) + */ +API_EXPORT(void) ap_table_merge_unique_token(table *t, const char *key, + const char *val) +{ + const char *curval; + + curval = ap_table_get(t, key); + if ((curval == NULL) || (!ap_find_token(t->a.pool, curval, val))) { + ap_table_merge(t, key, val); + } +} + +API_EXPORT(void) ap_table_mergen_unique_token(table *t, const char *key, + const char *val) +{ + const char *curval; + + curval = ap_table_get(t, key); + if ((curval == NULL) || (!ap_find_token(t->a.pool, curval, val))) { + ap_table_mergen(t, key, val); + } +} + API_EXPORT(void) ap_table_merge(table *t, const char *key, const char *val) { table_entry *elts = (table_entry *) t->a.elts; 1.19 +11 -1 apache-1.3/src/modules/standard/mod_headers.c Index: mod_headers.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_headers.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- mod_headers.c 1999/01/01 19:05:09 1.18 +++ mod_headers.c 1999/07/28 17:37:18 1.19 @@ -213,7 +213,17 @@ ap_table_addn(r->headers_out, hdr->header, hdr->value); break; case hdr_append: - ap_table_mergen(r->headers_out, hdr->header, hdr->value); + /* + * "Vary" is particularly sensitive to duplicate tokens; + * they break some browsers. + */ + if (strcasecmp(hdr->header, "Vary") == 0) { + ap_table_mergen_unique_token(r->headers_out, hdr->header, + hdr->value); + } + else { + ap_table_mergen(r->headers_out, hdr->header, hdr->value); + } break; case hdr_set: ap_table_setn(r->headers_out, hdr->header, hdr->value); 1.100 +15 -6 apache-1.3/src/modules/standard/mod_negotiation.c Index: mod_negotiation.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_negotiation.c,v retrieving revision 1.99 retrieving revision 1.100 diff -u -r1.99 -r1.100 --- mod_negotiation.c 1999/06/04 17:15:51 1.99 +++ mod_negotiation.c 1999/07/28 17:37:18 1.100 @@ -2194,12 +2194,21 @@ if (neg->is_transparent || vary_by_type || vary_by_language || vary_by_language || vary_by_charset || vary_by_encoding) { - ap_table_mergen(hdrs, "Vary", 2 + ap_pstrcat(r->pool, - neg->is_transparent ? ", negotiate" : "", - vary_by_type ? ", accept" : "", - vary_by_language ? ", accept-language" : "", - vary_by_charset ? ", accept-charset" : "", - vary_by_encoding ? ", accept-encoding" : "", NULL)); + if (neg->is_transparent) { + ap_table_mergen_unique_token(hdrs, "Vary", "negotiate"); + } + if (vary_by_type) { + ap_table_mergen_unique_token(hdrs, "Vary", "accept"); + } + if (vary_by_language) { + ap_table_mergen_unique_token(hdrs, "Vary", "accept-language"); + } + if (vary_by_charset) { + ap_table_mergen_unique_token(hdrs, "Vary", "accept-charset"); + } + if (vary_by_encoding) { + ap_table_mergen_unique_token(hdrs, "Vary", "accept-encoding"); + } } if (neg->is_transparent) { /* Create TCN response header */ 1.142 +2 -2 apache-1.3/src/modules/standard/mod_rewrite.c Index: mod_rewrite.c =================================================================== RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_rewrite.c,v retrieving revision 1.141 retrieving revision 1.142 diff -u -r1.141 -r1.142 --- mod_rewrite.c 1999/06/29 08:37:43 1.141 +++ mod_rewrite.c 1999/07/28 17:37:20 1.142 @@ -1880,7 +1880,7 @@ } vary = ap_table_get(r->notes, VARY_KEY_THIS); if (vary != NULL) { - ap_table_merge(r->notes, VARY_KEY, vary); + ap_table_merge_unique_token(r->notes, VARY_KEY, vary); ap_table_unset(r->notes, VARY_KEY_THIS); } } @@ -3781,7 +3781,7 @@ continue; } if (strcasecmp(hdrs[i].key, name) == 0) { - ap_table_merge(r->notes, VARY_KEY_THIS, name); + ap_table_merge_unique_token(r->notes, VARY_KEY_THIS, name); return hdrs[i].val; } } 1.22 +2 -0 apache-1.3/src/support/httpd.exp Index: httpd.exp =================================================================== RCS file: /home/cvs/apache-1.3/src/support/httpd.exp,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- httpd.exp 1999/06/16 21:27:20 1.21 +++ httpd.exp 1999/07/28 17:37:22 1.22 @@ -337,6 +337,8 @@ ap_table_get ap_table_merge ap_table_mergen +ap_table_mergen_unique_token +ap_table_merge_unique_token ap_table_set ap_table_setn ap_table_unset