You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by nd...@apache.org on 2004/04/10 19:48:52 UTC

cvs commit: httpd-2.0/modules/loggers mod_log_config.c

nd          2004/04/10 10:48:52

  Modified:    .        CHANGES
               modules/loggers mod_log_config.c
  Log:
  cleanup log_header_out function:
  - no need to ask r->err_headers_out, because it's already merged with
    r->headers_out at this stage
  - allow multiple headers like Set-Cookie to be logged properly
  
  PR: 27787
  
  Revision  Changes    Path
  1.1452    +3 -0      httpd-2.0/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/CHANGES,v
  retrieving revision 1.1451
  retrieving revision 1.1452
  diff -u -u -r1.1451 -r1.1452
  --- CHANGES	10 Apr 2004 13:57:38 -0000	1.1451
  +++ CHANGES	10 Apr 2004 17:48:52 -0000	1.1452
  @@ -2,6 +2,9 @@
   
     [Remove entries to the current 2.0 section below, when backported]
   
  +  *) mod_log_config now logs all Set-Cookie headers if the %{Set-Cookie}o
  +     format is used.  PR 27787.  [Andr� Malo]
  +
     *) Fix a bunch of cases where the return code of the regex compiler
        was not checked properly. This affects: mod_setenvif, mod_usertrack,
        mod_proxy, mod_proxy_ftp and core. PR 28218.  [Andr� Malo]
  
  
  
  1.116     +75 -4     httpd-2.0/modules/loggers/mod_log_config.c
  
  Index: mod_log_config.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/loggers/mod_log_config.c,v
  retrieving revision 1.115
  retrieving revision 1.116
  diff -u -u -r1.115 -r1.116
  --- mod_log_config.c	26 Feb 2004 20:15:26 -0000	1.115
  +++ mod_log_config.c	10 Apr 2004 17:48:52 -0000	1.116
  @@ -403,16 +403,87 @@
       return ap_escape_logitem(r->pool, apr_table_get(r->headers_in, a));
   }
   
  +static APR_INLINE char *find_multiple_headers(apr_pool_t *pool,
  +                                              const apr_table_t *table,
  +                                              const char *key)
  +{
  +    const apr_array_header_t *elts;
  +    const apr_table_entry_t *t_elt;
  +    const apr_table_entry_t *t_end;
  +    apr_size_t len;
  +    struct sle {
  +        struct sle *next;
  +        const char *value;
  +        apr_size_t len;
  +    } *result_list, *rp;
  +
  +    elts = apr_table_elts(table);
  +
  +    if (!elts->nelts) {
  +        return NULL;
  +    }
  +
  +    t_elt = (const apr_table_entry_t *)elts->elts;
  +    t_end = t_elt + elts->nelts;
  +    len = 1; /* \0 */
  +    result_list = rp = NULL;
  +
  +    do {
  +        if (!strcasecmp(t_elt->key, key)) {
  +            if (!result_list) {
  +                result_list = rp = apr_palloc(pool, sizeof(*rp));
  +            }
  +            else {
  +                rp = rp->next = apr_palloc(pool, sizeof(*rp));
  +                len += 2; /* ", " */
  +            }
  +
  +            rp->next = NULL;
  +            rp->value = t_elt->val;
  +            rp->len = strlen(rp->value);
  +
  +            len += rp->len;
  +        }
  +        ++t_elt;
  +    } while (t_elt < t_end);
  +
  +    if (result_list) {
  +        char *result = apr_palloc(pool, len);
  +        char *cp = result;
  +
  +        rp = result_list;
  +        while (rp) {
  +            if (rp != result_list) {
  +                *cp++ = ',';
  +                *cp++ = ' ';
  +            }
  +            memcpy(cp, rp->value, rp->len);
  +            cp += rp->len;
  +            rp = rp->next;
  +        }
  +        *cp = '\0';
  +
  +        return result;
  +    }
  +
  +    return NULL;
  +}
  +
   static const char *log_header_out(request_rec *r, char *a)
   {
  -    const char *cp = apr_table_get(r->headers_out, a);
  +    const char *cp = NULL;
  +
       if (!strcasecmp(a, "Content-type") && r->content_type) {
           cp = ap_field_noparam(r->pool, r->content_type);
       }
  -    if (cp) {
  -        return ap_escape_logitem(r->pool, cp);
  +    else if (!strcasecmp(a, "Set-Cookie")) {
  +        cp = find_multiple_headers(r->pool, r->headers_out, a);
  +    }
  +    else {
  +        cp = apr_table_get(r->headers_out, a);
       }
  -    return ap_escape_logitem(r->pool, apr_table_get(r->err_headers_out, a));
  +
  +    return ap_escape_logitem(r->pool, cp);
   }
   
   static const char *log_note(request_rec *r, char *a)