dgaudet 99/07/29 10:54:16
Modified: . STATUS src ApacheCore.def CHANGES src/include alloc.h ap_mmn.h src/main alloc.c src/modules/standard mod_headers.c mod_negotiation.c mod_rewrite.c src/support httpd.exp Log: back out Ken's recent patch, I'm vetoing it: - it adds a new API which can only be implemented through O(n^2) methods - it does not solve the problem in a way which is compatible with existing modules - We went over this, and other solutions were presented. The current situation is already O(n^2), so I'm not just vetoing this based on that -- I'm vetoing this because I don't want another O(n^2) API embedded into the code. A solution which would retain more compatibility with existing modules would add an "table *vary" to the request_rec, and then modify ap_send_http_header to merge the contents of the table and any "Vary" entry in r->headers_out. This can be done with a simple sort operation. Revision Changes Path 1.728 +14 -0 apache-1.3/STATUS Index: STATUS =================================================================== RCS file: /home/cvs/apache-1.3/STATUS,v retrieving revision 1.727 retrieving revision 1.728 diff -u -r1.727 -r1.728 --- STATUS 1999/07/28 17:37:05 1.727 +++ STATUS 1999/07/29 17:53:36 1.728 @@ -1,5 +1,5 @@ 1.3 STATUS: - Last modified at [$Date: 1999/07/28 17:37:05 $] + Last modified at [$Date: 1999/07/29 17:53:36 $] Release: @@ -64,9 +64,23 @@ mips-dec-ultrix4.4 no Sameer Parekh mips-unknown-linux yes Lars Eilebrecht + * 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 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.16 +0 -3 apache-1.3/src/ApacheCore.def Index: ApacheCore.def =================================================================== RCS file: /home/cvs/apache-1.3/src/ApacheCore.def,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- ApacheCore.def 1999/07/28 18:20:53 1.15 +++ ApacheCore.def 1999/07/29 17:53:43 1.16 @@ -343,7 +343,4 @@ ap_standalone @337 ap_server_confname @338 ap_sub_req_method_uri @339 - ap_field_noparam @340 - ap_table_merge_unique_token @341 - ap_table_mergen_unique_token @342 1.1401 +0 -7 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.1400 retrieving revision 1.1401 diff -u -r1.1400 -r1.1401 --- CHANGES 1999/07/28 17:37:09 1.1400 +++ CHANGES 1999/07/29 17:53:45 1.1401 @@ -1,12 +1,5 @@ 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.70 +0 -4 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.69 retrieving revision 1.70 diff -u -r1.69 -r1.70 --- alloc.h 1999/07/28 17:37:14 1.69 +++ alloc.h 1999/07/29 17:53:54 1.70 @@ -225,10 +225,6 @@ 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.40 +1 -2 apache-1.3/src/include/ap_mmn.h Index: ap_mmn.h =================================================================== RCS file: /home/cvs/apache-1.3/src/include/ap_mmn.h,v retrieving revision 1.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- ap_mmn.h 1999/07/28 18:20:54 1.39 +++ ap_mmn.h 1999/07/29 17:53:55 1.40 @@ -220,7 +220,6 @@ * 19990320.3 - add ap_regexec() * 19990604.4 - add ap_field_noparam() * 19990621.5 - add local_ip/host to conn_rec for mass-vhost - * 19990728.6 - add ap_table_merge[n]_unique_token */ #define MODULE_MAGIC_COOKIE 0x41503133UL /* "AP13" */ @@ -228,7 +227,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 19990320 #endif -#define MODULE_MAGIC_NUMBER_MINOR 6 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 5 /* 0...n */ #define MODULE_MAGIC_NUMBER MODULE_MAGIC_NUMBER_MAJOR /* backward compat */ /* Useful for testing for features. */ 1.115 +0 -26 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.114 retrieving revision 1.115 diff -u -r1.114 -r1.115 --- alloc.c 1999/07/28 17:37:16 1.114 +++ alloc.c 1999/07/29 17:53:57 1.115 @@ -1346,32 +1346,6 @@ } } -/* - * 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.20 +1 -11 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.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- mod_headers.c 1999/07/28 17:37:18 1.19 +++ mod_headers.c 1999/07/29 17:54:05 1.20 @@ -213,17 +213,7 @@ ap_table_addn(r->headers_out, hdr->header, hdr->value); break; case hdr_append: - /* - * "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); - } + 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.101 +6 -15 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.100 retrieving revision 1.101 diff -u -r1.100 -r1.101 --- mod_negotiation.c 1999/07/28 17:37:18 1.100 +++ mod_negotiation.c 1999/07/29 17:54:06 1.101 @@ -2194,21 +2194,12 @@ if (neg->is_transparent || vary_by_type || vary_by_language || vary_by_language || vary_by_charset || vary_by_encoding) { - 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"); - } + 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) { /* Create TCN response header */ 1.143 +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.142 retrieving revision 1.143 diff -u -r1.142 -r1.143 --- mod_rewrite.c 1999/07/28 17:37:20 1.142 +++ mod_rewrite.c 1999/07/29 17:54:06 1.143 @@ -1880,7 +1880,7 @@ } vary = ap_table_get(r->notes, VARY_KEY_THIS); if (vary != NULL) { - ap_table_merge_unique_token(r->notes, VARY_KEY, vary); + ap_table_merge(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_unique_token(r->notes, VARY_KEY_THIS, name); + ap_table_merge(r->notes, VARY_KEY_THIS, name); return hdrs[i].val; } } 1.23 +0 -2 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.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- httpd.exp 1999/07/28 17:37:22 1.22 +++ httpd.exp 1999/07/29 17:54:14 1.23 @@ -337,8 +337,6 @@ 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