vulcano$ diff -u mod_headers.c.orig mod_headers.c
--- mod_headers.c.orig  Wed Apr 23 14:16:51 2008
+++ mod_headers.c       Wed Apr 23 14:16:42 2008
@@ -34,6 +34,9 @@
  *              headers with the same name
  *     append - append this text onto any existing header of this same
  *     unset  - remove this header
+ *     edit   - this request header exists, its value is transformed
+ *              according to a regular expression search-and-replace.
+ *     fset   - set this header, only if the header doesn't exist before.
  *
  * Where action is unset, the third argument (value) should not be given.
  * The header name can include the colon, or not.
@@ -90,7 +93,8 @@
     hdr_append = 'm',           /* append (merge into any old value) */
     hdr_unset = 'u',            /* unset header */
     hdr_echo = 'e',             /* echo headers from request to response */
-    hdr_edit = 'r'              /* change value by regexp */
+    hdr_edit = 'r',              /* change value by regexp */
+    hdr_fset = 'f'              /* set header only if header doesn't exist */
 } hdr_actions;

 /*
@@ -400,6 +404,8 @@
         new->action = hdr_echo;
     else if (!strcasecmp(action, "edit"))
         new->action = hdr_edit;
+    else if (!strcasecmp(action, "fset"))
+        new->action = hdr_fset;
     else
         return "first argument must be 'add', 'set', 'append', 'unset', "
                "'echo' or 'edit'.";
@@ -629,6 +635,18 @@
                                process_regexp(hdr, val, r->pool));
             }
             break;
+        case hdr_fset:
+           val = apr_table_get(headers, hdr->header);
+           if (val == NULL) {
+               val = process_tags(hdr, r);
+               apr_table_setn(headers, hdr->header, val);
+               ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
+                   "%s: fset to %s", hdr->header, val);
+           } else {
+               ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
+                   "%s: is found and will remain: %s", hdr->header, val);
+           }
+            break;
         }
     }
 }
