pcs 98/12/04 10:29:45
Modified: src CHANGES src/modules/standard mod_negotiation.c Log: Fix negotiation so that a Vary response header is correctly generated when, for a particular dimension, variants only vary in having or not having a value for that dimension. Revision Changes Path 1.1161 +4 -0 apache-1.3/src/CHANGES Index: CHANGES =================================================================== RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v retrieving revision 1.1160 retrieving revision 1.1161 diff -u -r1.1160 -r1.1161 --- CHANGES 1998/12/04 17:37:09 1.1160 +++ CHANGES 1998/12/04 18:29:42 1.1161 @@ -1,5 +1,9 @@ Changes with Apache 1.3.4 + *) Fix negotiation so that a Vary response header is correctly + generated when, for a particular dimension, variants only vary + in having or not having a value for that dimension. [Paul Sutton] + *) Fix negotiation so that we prefer an encoded variant over an unencoded variant if the user-agent explicitly says it can accept that encoding. Previously we always preferred the unencoded 1.87 +47 -40 apache-1.3/src/modules/standard/mod_negotiation.c Index: mod_negotiation.c =================================================================== RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_negotiation.c,v retrieving revision 1.86 retrieving revision 1.87 diff -u -r1.86 -r1.87 --- mod_negotiation.c 1998/12/04 17:37:12 1.86 +++ mod_negotiation.c 1998/12/04 18:29:44 1.87 @@ -1847,6 +1847,7 @@ char *sample_language = NULL; const char *sample_encoding = NULL; char *sample_charset = NULL; + int first_variant = 1; int vary_by_type = 0; int vary_by_language = 0; int vary_by_charset = 0; @@ -1863,6 +1864,7 @@ char qstr[6]; long len; char lenstr[22]; /* enough for 2^64 */ + char *lang; ap_snprintf(qstr, sizeof(qstr), "%1.3f", variant->type_quality); @@ -1878,49 +1880,52 @@ } rec = ap_pstrcat(r->pool, "{\"", variant->file_name, "\" ", qstr, NULL); - if (variant->type_name) { - if (*variant->type_name) { - rec = ap_pstrcat(r->pool, rec, " {type ", - variant->type_name, "}", NULL); - } - if (!sample_type) { - sample_type = variant->type_name; - } - else if (strcmp(sample_type, variant->type_name)) { - vary_by_type = 1; - } + + if (first_variant) { + sample_type = variant->type_name; + } else if (strcmp(sample_type ? sample_type : "", + variant->type_name ? variant->type_name : "")) { + vary_by_type = 1; + } + if (variant->type_name && *variant->type_name) { + rec = ap_pstrcat(r->pool, rec, " {type ", + variant->type_name, "}", NULL); } + if (variant->content_languages && variant->content_languages->nelts) { - char *langs = merge_string_array(r->pool, - variant->content_languages, ","); - rec = ap_pstrcat(r->pool, rec, " {language ", langs, "}", NULL); - if (!sample_language) { - sample_language = langs; - } - else if (strcmp(sample_language, langs)) { - vary_by_language = 1; - } - } - if (variant->content_encoding) { - if (!sample_encoding) { - sample_encoding = variant->content_encoding; - } - else if (strcmp(sample_encoding, variant->content_encoding)) { - vary_by_encoding = 1; - } - } - if (variant->content_charset) { - if (*variant->content_charset) { - rec = ap_pstrcat(r->pool, rec, " {charset ", - variant->content_charset, "}", NULL); - } - if (!sample_charset) { - sample_charset = variant->content_charset; - } - else if (strcmp(sample_charset, variant->content_charset)) { - vary_by_charset = 1; - } + lang = merge_string_array(r->pool, + variant->content_languages, ","); + rec = ap_pstrcat(r->pool, rec, " {language ", lang, "}", NULL); + } else { + lang = NULL; + } + if (first_variant) { + sample_language = lang; + } else if (strcmp(sample_language ? sample_language : "", + lang ? lang : "")) { + vary_by_language = 1; + } + + if (first_variant) { + sample_encoding = variant->content_encoding; + } else if (strcmp(sample_encoding ? sample_encoding : "", + variant->content_encoding ? + variant->content_encoding : "")) { + vary_by_encoding = 1; + } + + if (first_variant) { + sample_charset = variant->content_charset; + } else if (strcmp(sample_charset ? sample_charset : "", + variant->content_charset ? variant->content_charset + : "")) { + vary_by_charset = 1; + } + if (variant->content_charset && *variant->content_charset) { + rec = ap_pstrcat(r->pool, rec, " {charset ", + variant->content_charset, "}", NULL); } + if ((len = find_content_length(neg, variant)) != 0) { ap_snprintf(lenstr, sizeof(lenstr), "%ld", len); rec = ap_pstrcat(r->pool, rec, " {length ", lenstr, "}", NULL); @@ -1931,6 +1936,8 @@ if (na_result != na_not_applied) { ap_table_mergen(hdrs, "Alternates", rec); } + + first_variant = 0; } if (na_result != na_not_applied) {