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);
+ }
}
}
}