The attached patch makes subexpression capturing possible. I've missed this 
for a long time ;-)
Any objections to commit it?

Btw: ap_pregsub treats '&' as $0 (whole match). Is it documented somewhere? 
Is it used or at least useful somewhere? It looks for me like a legacy, 
that should be removed (in 2.1), since it may lead to unexpected behaviour. 
(ISTR that it actually did in early 1.3 versions in mod_rewrite). Opinions?

nd
-- 
Wenn nur Ingenieure mit Diplom programmieren w�rden, h�tten wir
wahrscheinlich weniger schlechte Software.
Wir h�tten allerdings auch weniger gute Software.
                                   -- Felix von Leitner in dasr
Index: modules/metadata/mod_setenvif.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/metadata/mod_setenvif.c,v
retrieving revision 1.41
diff -u -r1.41 mod_setenvif.c
--- modules/metadata/mod_setenvif.c     12 Feb 2003 17:58:09 -0000      1.41
+++ modules/metadata/mod_setenvif.c     12 Feb 2003 23:42:16 -0000
@@ -351,8 +351,7 @@
         }
         else {
             new->preg = ap_pregcomp(cmd->pool, regex,
-                                    (REG_EXTENDED | REG_NOSUB
-                                     | (icase ? REG_ICASE : 0)));
+                                    (REG_EXTENDED | (icase ? REG_ICASE : 0)));
             if (new->preg == NULL) {
                 return apr_pstrcat(cmd->pool, cmd->cmd->name,
                                    " regex could not be compiled.", NULL);
@@ -490,6 +489,7 @@
     apr_size_t val_len = 0;
     int i, j;
     char *last_name;
+    regmatch_t regm[10];
 
     if (!ap_get_module_config(r->request_config, &setenvif_module)) {
         ap_set_module_config(r->request_config, &setenvif_module,
@@ -577,7 +577,8 @@
         }
 
         if ((b->pattern && apr_strmatch(b->pattern, val, val_len)) ||
-            (!b->pattern && !ap_regexec(b->preg, val, 0, NULL, 0))) {
+            (!b->pattern && !ap_regexec(b->preg, val, b->preg->re_nsub + 1,
+                                        regm, 0))) {
             const apr_array_header_t *arr = apr_table_elts(b->features);
             elts = (const apr_table_entry_t *) arr->elts;
 
@@ -586,7 +587,18 @@
                     apr_table_unset(r->subprocess_env, elts[j].key);
                 }
                 else {
-                    apr_table_setn(r->subprocess_env, elts[j].key, elts[j].val);
+                    if (!b->pattern) {
+                        char *replaced = ap_pregsub(r->pool, elts[j].val, val,
+                                                    b->preg->re_nsub + 1, regm);
+                        if (replaced) {
+                            apr_table_setn(r->subprocess_env, elts[j].key,
+                                           replaced);
+                        }
+                    }
+                    else {
+                        apr_table_setn(r->subprocess_env, elts[j].key,
+                                       elts[j].val);
+                    }
                 }
             }
         }

Reply via email to