You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by Roy Fielding <fi...@hyperreal.com> on 1997/03/14 04:27:35 UTC

cvs commit: apache/src CHANGES mod_negotiation.c

fielding    97/03/13 19:27:34

  Modified:    src       CHANGES mod_negotiation.c
  Log:
  Negotiation changes: Don't output empty content-type in variant list;
  Output charset in variant list; Return sooner from handle_multi() if
  no variants found; Add handling of '*' wildcard in Accept-Charset.
  
  Submitted by: Petr Lampa and Paul Sutton
  Reviewed by: Roy Fielding, Jim Jagielski
  
  Revision  Changes    Path
  1.197     +5 -0      apache/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache/src/CHANGES,v
  retrieving revision 1.196
  retrieving revision 1.197
  diff -C3 -r1.196 -r1.197
  *** CHANGES	1997/03/11 06:04:38	1.196
  --- CHANGES	1997/03/14 03:27:31	1.197
  ***************
  *** 1,5 ****
  --- 1,10 ----
    Changes with Apache 1.2b8
    
  +   *) Negotiation changes: Don't output empty content-type in variant list;
  +      Output charset in variant list; Return sooner from handle_multi() if
  +      no variants found; Add handling of '*' wildcard in Accept-Charset.
  +      [Petr Lampa and Paul Sutton]
  + 
      *) Memory allocation problem in push_array() -- it would corrupt memory
         when nalloc==0.  [Kai Risku <kr...@tf.hut.fi> and Roy Fielding]
    
  
  
  
  1.35      +23 -14    apache/src/mod_negotiation.c
  
  Index: mod_negotiation.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/mod_negotiation.c,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -C3 -r1.34 -r1.35
  *** mod_negotiation.c	1997/03/07 14:15:43	1.34
  --- mod_negotiation.c	1997/03/14 03:27:32	1.35
  ***************
  *** 1274,1291 ****
        int i;
        accept_rec *accept_recs = (accept_rec *)neg->accept_charsets->elts;
        char *charset = variant->content_charset;
  ! 
  !     if (!charset)
  !         return;                 /* variant has no charset */
    
        /* if no Accept-Charset: header, leave quality alone (will
         * remain at the default value of 1) */
        if (!neg->accept_charsets || neg->accept_charsets->nelts == 0) 
            return;
    
  !     if (!*charset || !strcmp(charset, "iso-8859-1"))
  !         return;                 /* default charset always ok */
  ! 
    
        /*
         * Go through each of the items on the Accept-Charset: header,
  --- 1274,1287 ----
        int i;
        accept_rec *accept_recs = (accept_rec *)neg->accept_charsets->elts;
        char *charset = variant->content_charset;
  !     accept_rec *star = NULL;
    
        /* if no Accept-Charset: header, leave quality alone (will
         * remain at the default value of 1) */
        if (!neg->accept_charsets || neg->accept_charsets->nelts == 0) 
            return;
    
  !     if (charset == NULL || !*charset) charset = "iso-8859-1";
    
        /*
         * Go through each of the items on the Accept-Charset: header,
  ***************
  *** 1299,1307 ****
            if (!strcmp(type->type_name, charset)) {
                variant->charset_quality = type->quality;
                return;
            }
        }
  !     variant->charset_quality = 0.0;
    }
    
    /* For a given variant, find the best matching Accept: header
  --- 1295,1316 ----
            if (!strcmp(type->type_name, charset)) {
                variant->charset_quality = type->quality;
                return;
  +         } else
  +         if (strcmp(type->type_name, "*") == 0) {
  +             star = type;    
            }
        }
  !     /* No explicit match */
  !     if (star) {
  !         variant->charset_quality = star->quality;
  !         return;
  !     }
  !     /* If this variant is in charset iso-8859-1, the default is 1.0 */
  !     if (strcmp(charset, "iso-8859-1") == 0) {
  !         variant->charset_quality = 1.0;
  !     } else {
  !         variant->charset_quality = 0.0;
  !     }
    }
    
    /* For a given variant, find the best matching Accept: header
  ***************
  *** 1737,1743 ****
        for (i = 0; i < neg->avail_vars->nelts; ++i) {
            var_rec *variant = &((var_rec *)neg->avail_vars->elts)[i];
            char *filename = variant->file_name ? variant->file_name : "";
  -         char *content_type = variant->type_name ? variant->type_name : "";
            array_header *languages = variant->content_languages;
            char *description = variant->description ? variant->description : "";
    
  --- 1746,1751 ----
  ***************
  *** 1746,1757 ****
    	 * 'English'). */
            t = pstrcat(r->pool, t, "<li><a href=\"", filename, "\">", 
                        filename, "</a> ", description, NULL);
  ! 	if (content_type)
  ! 	    t = pstrcat(r->pool, t, " type ", content_type, NULL);
    	if (languages && languages->nelts)
  ! 	    t = pstrcat(r->pool, t, " language ",
    			merge_string_array(r->pool, languages, ", "),
    			NULL);
    	t = pstrcat(r->pool, t, "\n", NULL);
        }
        t = pstrcat(r->pool, t, "</ul>\n", NULL);
  --- 1754,1767 ----
    	 * 'English'). */
            t = pstrcat(r->pool, t, "<li><a href=\"", filename, "\">", 
                        filename, "</a> ", description, NULL);
  ! 	if (variant->type_name && *variant->type_name)
  ! 	    t = pstrcat(r->pool, t, ", type ", variant->type_name, NULL);
    	if (languages && languages->nelts)
  ! 	    t = pstrcat(r->pool, t, ", language ",
    			merge_string_array(r->pool, languages, ", "),
    			NULL);
  + 	if (variant->content_charset && *variant->content_charset)
  + 	    t = pstrcat(r->pool, t, ", charset ", variant->content_charset, NULL);
    	t = pstrcat(r->pool, t, "\n", NULL);
        }
        t = pstrcat(r->pool, t, "</ul>\n", NULL);
  ***************
  *** 1897,1909 ****
            }
            return res;
        }
  !     
        maybe_add_default_encodings(neg,
                                    r->method_number != M_GET
                                      || r->args || r->path_info);
        
  -     if (neg->avail_vars->nelts == 0) return DECLINED;
  - 
        na_result = best_match(neg, &best);
        if (na_result == na_list) {
            /*
  --- 1907,1918 ----
            }
            return res;
        }
  !     if (neg->avail_vars->nelts == 0) return DECLINED;
  ! 
        maybe_add_default_encodings(neg,
                                    r->method_number != M_GET
                                      || r->args || r->path_info);
        
        na_result = best_match(neg, &best);
        if (na_result == na_list) {
            /*