]> granicus.if.org Git - apache/commitdiff
mod_headers: Add 'Header SetIfEmpty header-name val' to only set
authorGraham Leggett <minfrin@apache.org>
Sat, 14 Sep 2013 15:29:04 +0000 (15:29 +0000)
committerGraham Leggett <minfrin@apache.org>
Sat, 14 Sep 2013 15:29:04 +0000 (15:29 +0000)
a header if it's not already there (can't do this with Edit)

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

Submitted by: covener
Reviewed by: jim, humbedooh

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1523270 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 803581396e6eb00b5e28561118568f3eae9f378d..7beaef82a0905a2456da14664f1ad3e109400512 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,9 @@
 
 Changes with Apache 2.4.7
 
+  *) mod_headers: Add 'setifempty' command to Header and RequestHeader.
+     [Eric Covener]
+
   *) mod_logio: new format-specifier %C (combined) which is the sum of received
      and sent byte counts.
      PR54015 [Christophe Jaillet]
diff --git a/STATUS b/STATUS
index 1a2a5e516482055af810ef9c563100cc2354c82a..4cd4395dbaa499efde3b37189e601dd662e87c4d 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -97,13 +97,6 @@ RELEASE SHOWSTOPPERS:
 PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
   [ start all new proposals below, under PATCHES PROPOSED. ]
 
-
-  * mod_headers: Add 'Header SetIfEmpty header-name val' to only set
-    a header if it's not already there (can't do this with Edit)
-    trunk patch: http://svn.apache.org/1496338
-    2.4.x patch: trunk works
-    +1: covener, jim, humbedooh
-
   * 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
index 528e7f2d0d876e1b45e659240a460a320b74bed4..774cadc4f62c1ad1057d3889a0877d5c0c2e89e7 100644 (file)
@@ -248,6 +248,10 @@ Header merge Cache-Control no-store env=NO_STORE
     <dt><code>set</code></dt>
     <dd>The request header is set, replacing any previous header
     with this name</dd>
+  
+    <dt><code>setifempty</code></dt>
+    <dd>The request header is set, but only if there is no previous header
+    with this name</dd>
 
     <dt><code>unset</code></dt>
     <dd>The request header of this name is removed, if it exists. If
@@ -388,6 +392,10 @@ Header merge Cache-Control no-store env=NO_STORE
     <dd>The response header is set, replacing any previous header
     with this name. The <var>value</var> may be a format string.</dd>
 
+    <dt><code>setifempty</code></dt>
+    <dd>The request header is set, but only if there is no previous header
+    with this name</dd>
+
     <dt><code>unset</code></dt>
     <dd>The response header of this name is removed, if it exists.
     If there are multiple headers of the same name, all will be
index 9ce2fdec67f2f5da81390869371d3478e5194c18..6c03e71839da9d9d413bb8d9f9b115da9a7afb9e 100644 (file)
@@ -96,7 +96,8 @@ 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_edit_r = 'R',            /* change value by regexp, everymatch */
+    hdr_setifempty = 'i'        /* set value if header not already present*/
 } hdr_actions;
 
 /*
@@ -431,6 +432,8 @@ static APR_INLINE const char *header_inout_cmd(cmd_parms *cmd,
 
     if (!strcasecmp(action, "set"))
         new->action = hdr_set;
+    else if (!strcasecmp(action, "setifempty"))
+        new->action = hdr_setifempty;
     else if (!strcasecmp(action, "add"))
         new->action = hdr_add;
     else if (!strcasecmp(action, "append"))
@@ -446,7 +449,7 @@ static APR_INLINE const char *header_inout_cmd(cmd_parms *cmd,
     else if (!strcasecmp(action, "edit*"))
         new->action = hdr_edit_r;
     else
-        return "first argument must be 'add', 'set', 'append', 'merge', "
+        return "first argument must be 'add', 'set', 'setifempty', 'append', 'merge', "
                "'unset', 'echo', 'edit', or 'edit*'.";
 
     if (new->action == hdr_edit || new->action == hdr_edit_r) {
@@ -755,6 +758,14 @@ static int do_headers_fixup(request_rec *r, apr_table_t *headers,
             }
             apr_table_setn(headers, hdr->header, process_tags(hdr, r));
             break;
+        case hdr_setifempty:
+            if (NULL == apr_table_get(headers, hdr->header)) {
+                if (!strcasecmp(hdr->header, "Content-Type")) {
+                    ap_set_content_type(r, process_tags(hdr, r));
+                }
+                apr_table_setn(headers, hdr->header, process_tags(hdr, r));
+            }
+            break;
         case hdr_unset:
             apr_table_unset(headers, hdr->header);
             break;