akosut      96/08/15 11:36:46

  Modified:    src       mod_negotiation.c
  Log:
  Fix Vary mechanism to be more correct in how it determines the contents
  of the Vary header.
  
  Revision  Changes    Path
  1.12      +37 -17    apache/src/mod_negotiation.c
  
  Index: mod_negotiation.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/mod_negotiation.c,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -C3 -r1.11 -r1.12
  *** mod_negotiation.c 1996/07/28 22:40:55     1.11
  --- mod_negotiation.c 1996/08/15 18:36:42     1.12
  ***************
  *** 1022,1047 ****
    char *set_vary (pool *p, negotiation_state *neg)
    {
        var_rec *var_recs = (var_rec*)neg->avail_vars->elts;
  !     int i, accept_encoding = 0;
  !     int accept_language = 0;
  !     char *enc, *lang;
    
  !     /* Go through each variant and check for an encoding
  !      * or language (we always set "Accept", so no need to check).
         */
    
        for (i = 0; i < neg->avail_vars->nelts; ++i) {
  !         enc = var_recs[i].content_encoding;
  !     lang = var_recs[i].content_language;
  ! 
  !         if (!accept_encoding && !(!enc || !strcmp(enc, "")))
  !         accept_encoding = 1;
  !     if (!accept_language && !(!lang || !strcmp(lang, "")))
  !         accept_language = 1;
        }
    
  !     return pstrcat(p, "Accept", accept_encoding ? ", Accept-Encoding" : "",
  !                accept_language ? ", Accept-Language" : "", NULL);
    }
    
    /****************************************************************
  --- 1022,1064 ----
    char *set_vary (pool *p, negotiation_state *neg)
    {
        var_rec *var_recs = (var_rec*)neg->avail_vars->elts;
  !     int i;
  !     int accept_type, accept_enc, accept_lang;
  !     char *type, *enc, *lang;
  !     char *last_type, *last_enc, *last_lang;
    
  !     accept_type = accept_enc = accept_lang = 0;
  !     last_type = last_enc = last_lang = NULL;
  ! 
  !     /* Go through each variant and check for a differing
  !      * type, encoding or type.
         */
    
        for (i = 0; i < neg->avail_vars->nelts; ++i) {
  !     /* Ideally, we wouldn't have to do this, but strcmp(NULL, NULL)
  !      * isn't legal
  !      */
  !     type = var_recs[i].type_name ? var_recs[i].type_name : "";
  !         enc = var_recs[i].content_encoding ? var_recs[i].content_encoding : 
"";
  !        lang = var_recs[i].content_language ? var_recs[i].content_language : 
"";
  ! 
  !     if (!accept_type && last_type && strcmp(last_type, type))
  !         accept_type = 1;
  !     else if (!accept_type && !last_type) last_type = type;
  ! 
  !     if (!accept_enc && last_enc && strcmp(last_enc, enc))
  !         accept_enc = 1;
  !     else if (!accept_enc && !last_enc) last_enc = enc;
  ! 
  !     if (!accept_lang && last_lang && strcmp(last_lang, lang))
  !         accept_lang = 1;
  !     else if (!accept_lang && !last_lang) last_lang = lang;
        }
    
  !     if (!accept_type && !accept_enc && !accept_lang) return NULL;
  !     else return 2 + pstrcat(p, accept_type ? ", Accept" : "",
  !                         accept_enc ? ", Accept-Encoding" : "",
  !                         accept_lang ? ", Accept-Language" : "", NULL);
    }
    
    /****************************************************************
  ***************
  *** 1055,1061 ****
        var_rec *best;
        int res;
        
  !     char *udir;
        
        if ((res = read_type_map (neg, r->filename))) return res;
        
  --- 1072,1078 ----
        var_rec *best;
        int res;
        
  !     char *vary, *udir;
        
        if ((res = read_type_map (neg, r->filename))) return res;
        
  ***************
  *** 1073,1079 ****
         */
        if (!do_cache_negotiated_docs(r->server) && (r->proto_num < 1001))
            r->no_cache = 1;
  !     table_merge(r->err_headers_out, "Vary", set_vary(r->pool, neg));
    
        udir = make_dirstr (r->pool, r->uri, count_dirs (r->uri));
        udir = escape_uri(r->pool, udir);
  --- 1090,1097 ----
         */
        if (!do_cache_negotiated_docs(r->server) && (r->proto_num < 1001))
            r->no_cache = 1;
  !     if ((vary = set_vary(r->pool, neg)))
  !     table_merge(r->err_headers_out, "Vary", vary);
    
        udir = make_dirstr (r->pool, r->uri, count_dirs (r->uri));
        udir = escape_uri(r->pool, udir);
  ***************
  *** 1086,1091 ****
  --- 1104,1110 ----
        negotiation_state *neg;
        var_rec *best;
        request_rec *sub_req;
  +     char *vary;
        int res;
        
        if (r->finfo.st_mode != 0 || !(allow_options (r) & OPT_MULTI))
  ***************
  *** 1124,1130 ****
        
        if (!do_cache_negotiated_docs(r->server) && (r->proto_num < 1001))
            r->no_cache = 1;
  !     table_merge(r->err_headers_out, "Vary", set_vary(r->pool, neg));
    
        r->filename = sub_req->filename;
        r->handler = sub_req->handler;
  --- 1143,1150 ----
        
        if (!do_cache_negotiated_docs(r->server) && (r->proto_num < 1001))
            r->no_cache = 1;
  !     if ((vary = set_vary(r->pool, neg)))
  !     table_merge(r->err_headers_out, "Vary", vary);
    
        r->filename = sub_req->filename;
        r->handler = sub_req->handler;
  
  
  

Reply via email to