Received: by taz.hyperreal.com (8.6.12/8.6.5) id SAA27360; Sat, 8 Jun 1996 18:12:25 -0700 Received: by taz.hyperreal.com (8.6.12/8.6.5) id SAA27350; Sat, 8 Jun 1996 18:12:24 -0700 Date: Sat, 8 Jun 1996 18:12:24 -0700 From: Alexei Kosut Message-Id: <199606090112.SAA27350@taz.hyperreal.com> To: apache-cvs@hyperreal.com Subject: cvs commit: apache/src mod_negotiation.c Sender: owner-apache-cvs@apache.org Precedence: bulk akosut 96/06/08 18:12:23 Modified: src mod_negotiation.c Log: Cause Accept values with wildcards to be treated with less priority than those without wildcards at the same quality value. Revision Changes Path 1.8 +32 -14 apache/src/mod_negotiation.c Index: mod_negotiation.c =================================================================== RCS file: /export/home/cvs/apache/src/mod_negotiation.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C3 -r1.7 -r1.8 *** mod_negotiation.c 1996/05/27 19:48:39 1.7 --- mod_negotiation.c 1996/06/09 01:12:21 1.8 *************** *** 175,185 **** int is_pseudo_html; /* text/html, *or* the INCLUDES_MAGIC_TYPEs */ /* Above are all written-once properties of the variant. The ! * two fields below are changed during negotiation: */ float quality; float level_matched; } var_rec; /* Something to carry around the state of negotiation (and to keep --- 175,186 ---- int is_pseudo_html; /* text/html, *or* the INCLUDES_MAGIC_TYPEs */ /* Above are all written-once properties of the variant. The ! * three fields below are changed during negotiation: */ float quality; float level_matched; + int mime_stars; } var_rec; /* Something to carry around the state of negotiation (and to keep *************** *** 216,221 **** --- 217,223 ---- mime_info->quality = 0.0; mime_info->bytes = 0; mime_info->lang_index = -1; + mime_info->mime_stars = 0; } /* Initializing the relevant fields of a variant record from the *************** *** 674,679 **** --- 676,684 ---- * * Note also that if we get an exact match on the media type, we update * level_matched for use in level_cmp below... + * + * We also give a value for mime_stars, which is used later. It should + * be 1 for star/star, 2 for type/star and 3 for type/subtype. */ int mime_match (accept_rec *accept, var_rec *avail) *************** *** 682,697 **** char *avail_type = avail->type_name; int len = strlen(accept_type); ! if (accept_type[0] == '*') /* Anything matches star/star */ return 1; ! else if (accept_type[len - 1] == '*') ! return !strncmp (accept_type, avail_type, len - 2); else if (!strcmp (accept_type, avail_type) || (!strcmp (accept_type, "text/html") && (!strcmp(avail_type, INCLUDES_MAGIC_TYPE) || !strcmp(avail_type, INCLUDES_MAGIC_TYPE3)))) { if (accept->level >= avail->level) { avail->level_matched = avail->level; return 1; } } --- 687,710 ---- char *avail_type = avail->type_name; int len = strlen(accept_type); ! if (accept_type[0] == '*') { /* Anything matches star/star */ ! if (avail->mime_stars < 1) ! avail->mime_stars = 1; return 1; ! } ! else if ((accept_type[len - 1] == '*') && ! !strncmp (accept_type, avail_type, len - 2)) { ! if (avail->mime_stars < 2) ! avail->mime_stars = 2; ! return 1; ! } else if (!strcmp (accept_type, avail_type) || (!strcmp (accept_type, "text/html") && (!strcmp(avail_type, INCLUDES_MAGIC_TYPE) || !strcmp(avail_type, INCLUDES_MAGIC_TYPE3)))) { if (accept->level >= avail->level) { avail->level_matched = avail->level; + avail->mime_stars = 3; return 1; } } *************** *** 870,876 **** return; /* Lose any variant with an unacceptable content encoding */ ! for (i = 0; i < neg->avail_vars->nelts; ++i) if (var_recs[i].quality > 0 && !find_encoding (neg->accept_encodings, --- 883,889 ---- return; /* Lose any variant with an unacceptable content encoding */ ! for (i = 0; i < neg->avail_vars->nelts; ++i) if (var_recs[i].quality > 0 && !find_encoding (neg->accept_encodings, *************** *** 960,965 **** --- 973,982 ---- * tied variants by whatever means it likes. This server * breaks ties as follows, in order: * + * By perferring non-wildcard entries to those with + * wildcards. The spec specifically says we should + * do this, and it makes a lot of sense. + * * By order of languages in Accept-language, to give the * client a way to specify a language preference. I'd prefer * to give this precedence over media type, but the standard *************** *** 979,993 **** if (q > best_quality || (q == best_quality ! && (variant->lang_index < best->lang_index ! || (variant->lang_index == best->lang_index ! && ((levcmp = level_cmp (variant, best)) == 1 ! || (levcmp == 0 ! && !strcmp (variant->type_name, ! best->type_name) ! && (find_content_length(neg, variant) ! < ! find_content_length(neg, best)))))))) { best = variant; best_quality = q; --- 996,1011 ---- if (q > best_quality || (q == best_quality ! && ((variant->mime_stars > best->mime_stars) ! || (variant->lang_index < best->lang_index ! || (variant->lang_index == best->lang_index ! && ((levcmp = level_cmp (variant, best)) == 1 ! || (levcmp == 0 ! && !strcmp (variant->type_name, ! best->type_name) ! && (find_content_length(neg, variant) ! < ! find_content_length(neg, best))))))))) { best = variant; best_quality = q;