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;
  
  
  

Reply via email to