]> granicus.if.org Git - apache/commitdiff
mod_headers: Add 'Header note header-name note-name' to copy a headers
authorGraham Leggett <minfrin@apache.org>
Sat, 14 Sep 2013 15:31:35 +0000 (15:31 +0000)
committerGraham Leggett <minfrin@apache.org>
Sat, 14 Sep 2013 15:31:35 +0000 (15:31 +0000)
value into a note (so a CGI/Proxy header can be deleted and logged)

trunk patch: http://svn.apache.org/r1520908

Submitted by: covener
Reviewed by: jim, humbedooh

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1523271 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
STATUS
docs/manual/mod/mod_headers.xml
modules/metadata/mod_headers.c

diff --git a/CHANGES b/CHANGES
index 7beaef82a0905a2456da14664f1ad3e109400512..21c73741ad81851ea596428840d821f938f786a4 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,9 @@
 
 Changes with Apache 2.4.7
 
+  *) mod_headers: Add 'Header note header-name note-name' for copying a response
+     headers value into a note. [Eric Covener]
+
   *) mod_headers: Add 'setifempty' command to Header and RequestHeader.
      [Eric Covener]
 
diff --git a/STATUS b/STATUS
index 4cd4395dbaa499efde3b37189e601dd662e87c4d..6cac228d20cd80c974fb2e12faa958c53cfe5ec9 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -97,12 +97,6 @@ RELEASE SHOWSTOPPERS:
 PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
   [ start all new proposals below, under PATCHES PROPOSED. ]
 
-  * mod_headers: Add 'Header note header-name note-name' to copy a headers 
-    value into a note (so a CGI/Proxy header can be deleted and logged)
-    trunk patch: http://svn.apache.org/r1520908
-    2.4.x patch: trunk works, if 1496338 above is merged first.
-    +1: covener, jim, humbedooh
-
 
 PATCHES PROPOSED TO BACKPORT FROM TRUNK:
   [ New proposals should be added at the end of the list ]
index 774cadc4f62c1ad1057d3889a0877d5c0c2e89e7..68ba926adda8bd71d458154901d932572298ea0c 100644 (file)
@@ -300,7 +300,7 @@ Header merge Cache-Control no-store env=NO_STORE
 <directivesynopsis>
 <name>Header</name>
 <description>Configure HTTP response headers</description>
-<syntax>Header [<var>condition</var>] add|append|echo|edit|edit*|merge|set|unset
+<syntax>Header [<var>condition</var>] add|append|echo|edit|edit*|merge|set|unset|note
 <var>header</var> [<var>value</var>] [<var>replacement</var>]
 [early|env=[!]<var>variable</var>]|expr=<var>expression</var>]
 </syntax>
@@ -400,6 +400,13 @@ Header merge Cache-Control no-store env=NO_STORE
     <dd>The response header of this name is removed, if it exists.
     If there are multiple headers of the same name, all will be
     removed. <var>value</var> must be omitted.</dd>
+
+    <dt><code>note</code></dt>
+    <dd>The value of the named response <var>header</var> is copied into an
+    internal note whose name is given by <var>value</var>.  This is useful
+    if a header sent by a CGI or proxied resource is configured to be unset
+    but should also be logged.</dd>
+
     </dl>
 
     <p>This argument is followed by a <var>header</var> name, which
index 6c03e71839da9d9d413bb8d9f9b115da9a7afb9e..55cfb50a9bfac8b025b27a75ce2bf0bbeb13a566 100644 (file)
@@ -96,8 +96,9 @@ typedef enum {
     hdr_unset = 'u',            /* unset header */
     hdr_echo = 'e',             /* echo headers from request to response */
     hdr_edit = 'r',             /* change value by regexp, match once */
-    hdr_edit_r = 'R',            /* change value by regexp, everymatch */
-    hdr_setifempty = 'i'        /* set value if header not already present*/
+    hdr_edit_r = 'R',           /* change value by regexp, everymatch */
+    hdr_setifempty = 'i',       /* set value if header not already present*/
+    hdr_note = 'n'              /* set value of header in a note */
 } hdr_actions;
 
 /*
@@ -448,9 +449,11 @@ static APR_INLINE const char *header_inout_cmd(cmd_parms *cmd,
         new->action = hdr_edit;
     else if (!strcasecmp(action, "edit*"))
         new->action = hdr_edit_r;
+    else if (!strcasecmp(action, "note"))
+        new->action = hdr_note;
     else
         return "first argument must be 'add', 'set', 'setifempty', 'append', 'merge', "
-               "'unset', 'echo', 'edit', or 'edit*'.";
+               "'unset', 'echo', 'note', 'edit', or 'edit*'.";
 
     if (new->action == hdr_edit || new->action == hdr_edit_r) {
         if (subs == NULL) {
@@ -796,6 +799,10 @@ static int do_headers_fixup(request_rec *r, apr_table_t *headers,
                 apr_table_do(add_them_all, (void *) headers, ed.t, NULL);
             }
             break;
+        case hdr_note:
+            apr_table_setn(r->notes, process_tags(hdr, r), apr_table_get(headers, hdr->header));
+            break;
         }
     }
     return 1;