Good stuff. And a usefull extra function in the API as well.

Dw

On 28 Jul 1999 [EMAIL PROTECTED] wrote:

> 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
>   
>   
>   
> 

Reply via email to