]> granicus.if.org Git - apache/commitdiff
cleanup log_header_out function:
authorAndré Malo <nd@apache.org>
Sat, 10 Apr 2004 17:48:52 +0000 (17:48 +0000)
committerAndré Malo <nd@apache.org>
Sat, 10 Apr 2004 17:48:52 +0000 (17:48 +0000)
- 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

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@103331 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/loggers/mod_log_config.c

diff --git a/CHANGES b/CHANGES
index 65433ebcb6acd42699a7ed2500c25e66b53adc91..6c27ddf646bb1cfde6ecc5188e18501f0335dfd2 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,9 @@ Changes with Apache 2.1.0-dev
 
   [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]
index 74673bbbf70582c4de27bc6adf22fede0824b630..5c025035851d9337a73c347592ed1835a99a50b2 100644 (file)
@@ -403,16 +403,87 @@ static const char *log_header_in(request_rec *r, char *a)
     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);
     }
-    return ap_escape_logitem(r->pool, apr_table_get(r->err_headers_out, a));
+    else {
+        cp = apr_table_get(r->headers_out, a);
+    }
+
+    return ap_escape_logitem(r->pool, cp);
 }
 
 static const char *log_note(request_rec *r, char *a)