1
0
mirror of https://github.com/apache/httpd.git synced 2025-07-29 09:01:18 +03:00

Add a "MATCH_" prefix to variables set within

LocationMatch/DirectoryMatch/FilesMatch.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1555266 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Graham Leggett
2014-01-03 22:26:55 +00:00
parent fef0c66526
commit 4fecd089c4
6 changed files with 38 additions and 30 deletions

View File

@ -887,15 +887,15 @@ the contents of file-system directories matching a regular expression.</descript
</note> </note>
<p>From 2.5.0 onwards, named groups and backreferences are captured and <p>From 2.5.0 onwards, named groups and backreferences are captured and
written to the environment with the corresponding name in upper case. written to the environment with the corresponding name prefixed with
This allows elements of paths to be referenced from within "MATCH_" and in upper case. This allows elements of paths to be referenced
<a href="expr.html">expressions</a> and modules like from within <a href="expr.html">expressions</a> and modules like
<module>mod_rewrite</module>. In order to prevent confusion, numbered <module>mod_rewrite</module>. In order to prevent confusion, numbered
(unnamed) backreferences are ignored. Use named groups instead.</p> (unnamed) backreferences are ignored. Use named groups instead.</p>
<highlight language="config"> <highlight language="config">
&lt;DirectoryMatch ^/var/www/combined/(?&lt;SITENAME&gt;[^/]+)&gt; &lt;DirectoryMatch ^/var/www/combined/(?&lt;sitename&gt;[^/]+)&gt;
require ldap-group cn=%{env:SITENAME},ou=combined,o=Example require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
&lt;/DirectoryMatch&gt; &lt;/DirectoryMatch&gt;
</highlight> </highlight>
</usage> </usage>
@ -1750,15 +1750,15 @@ filenames</description>
<p>would match most common Internet graphics formats.</p> <p>would match most common Internet graphics formats.</p>
<p>From 2.5.0 onwards, named groups and backreferences are captured and <p>From 2.5.0 onwards, named groups and backreferences are captured and
written to the environment with the corresponding name in upper case. written to the environment with the corresponding name prefixed with
This allows elements of files to be referenced from within "MATCH_" and in upper case. This allows elements of files to be referenced
<a href="expr.html">expressions</a> and modules like from within <a href="expr.html">expressions</a> and modules like
<module>mod_rewrite</module>. In order to prevent confusion, numbered <module>mod_rewrite</module>. In order to prevent confusion, numbered
(unnamed) backreferences are ignored. Use named groups instead.</p> (unnamed) backreferences are ignored. Use named groups instead.</p>
<highlight language="config"> <highlight language="config">
&lt;FileMatch ^(?&lt;SITENAME&gt;[^/]+)&gt; &lt;FileMatch ^(?&lt;sitename&gt;[^/]+)&gt;
require ldap-group cn=%{env:SITENAME},ou=combined,o=Example require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
&lt;/FileMatch&gt; &lt;/FileMatch&gt;
</highlight> </highlight>
</usage> </usage>
@ -2716,15 +2716,15 @@ matching URLs</description>
or <code>/special/data</code>.</p> or <code>/special/data</code>.</p>
<p>From 2.5.0 onwards, named groups and backreferences are captured and <p>From 2.5.0 onwards, named groups and backreferences are captured and
written to the environment with the corresponding name in upper case. written to the environment with the corresponding name prefixed with
This allows elements of URLs to be referenced from within "MATCH_" and in upper case. This allows elements of URLs to be referenced
<a href="expr.html">expressions</a> and modules like from within <a href="expr.html">expressions</a> and modules like
<module>mod_rewrite</module>. In order to prevent confusion, numbered <module>mod_rewrite</module>. In order to prevent confusion, numbered
(unnamed) backreferences are ignored. Use named groups instead.</p> (unnamed) backreferences are ignored. Use named groups instead.</p>
<highlight language="config"> <highlight language="config">
&lt;LocationMatch ^/combined/(?&lt;SITENAME&gt;[^/]+)&gt; &lt;LocationMatch ^/combined/(?&lt;sitename&gt;[^/]+)&gt;
require ldap-group cn=%{env:SITENAME},ou=combined,o=Example require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
&lt;/LocationMatch&gt; &lt;/LocationMatch&gt;
</highlight> </highlight>
</usage> </usage>

View File

@ -530,15 +530,15 @@ proxied resources</description>
using <glossary ref="regex">regular expressions</glossary>.</p> using <glossary ref="regex">regular expressions</glossary>.</p>
<p>From 2.5.0 onwards, named groups and backreferences are captured and <p>From 2.5.0 onwards, named groups and backreferences are captured and
written to the environment with the corresponding name in upper case. written to the environment with the corresponding name prefixed with
This allows elements of URLs to be referenced from within "MATCH_" and in upper case. This allows elements of URLs to be referenced
<a href="expr.html">expressions</a> and modules like from within <a href="expr.html">expressions</a> and modules like
<module>mod_rewrite</module>. In order to prevent confusion, numbered <module>mod_rewrite</module>. In order to prevent confusion, numbered
(unnamed) backreferences are ignored. Use named groups instead.</p> (unnamed) backreferences are ignored. Use named groups instead.</p>
<highlight language="config"> <highlight language="config">
&lt;ProxyMatch ^http://(?&lt;SITENAME&gt;[^/]+)&gt; &lt;ProxyMatch ^http://(?&lt;sitename&gt;[^/]+)&gt;
require ldap-group cn=%{env:SITENAME},ou=combined,o=Example require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
&lt;/ProxyMatch&gt; &lt;/ProxyMatch&gt;
</highlight> </highlight>
</usage> </usage>

View File

@ -77,6 +77,8 @@ extern "C" {
#define AP_REG_NOMEM 0x20 /* nomem in our code */ #define AP_REG_NOMEM 0x20 /* nomem in our code */
#define AP_REG_DOTALL 0x40 /* perl's /s flag */ #define AP_REG_DOTALL 0x40 /* perl's /s flag */
#define AP_REG_MATCH "MATCH_" /** suggested prefix for ap_regname */
/* Error values: */ /* Error values: */
enum { enum {
AP_REG_ASSERT = 1, /** internal error ? */ AP_REG_ASSERT = 1, /** internal error ? */
@ -156,7 +158,8 @@ AP_DECLARE(apr_size_t) ap_regerror(int errcode, const ap_regex_t *preg,
* @param upper If non zero, uppercase the names * @param upper If non zero, uppercase the names
*/ */
AP_DECLARE(int) ap_regname(const ap_regex_t *preg, AP_DECLARE(int) ap_regname(const ap_regex_t *preg,
apr_array_header_t *names, int upper); apr_array_header_t *names, const char *prefix,
int upper);
/** Destroy a pre-compiled regex. /** Destroy a pre-compiled regex.
* @param preg The pre-compiled regex to free. * @param preg The pre-compiled regex to free.

View File

@ -2275,7 +2275,7 @@ static const char *proxysection(cmd_parms *cmd, void *mconfig, const char *arg)
if (r) { if (r) {
conf->refs = apr_array_make(cmd->pool, 8, sizeof(char *)); conf->refs = apr_array_make(cmd->pool, 8, sizeof(char *));
ap_regname(r, conf->refs, 1); ap_regname(r, conf->refs, AP_REG_MATCH, 1);
} }
ap_add_per_proxy_conf(cmd->server, new_dir_conf); ap_add_per_proxy_conf(cmd->server, new_dir_conf);

View File

@ -2223,7 +2223,7 @@ static const char *dirsection(cmd_parms *cmd, void *mconfig, const char *arg)
if (r) { if (r) {
conf->refs = apr_array_make(cmd->pool, 8, sizeof(char *)); conf->refs = apr_array_make(cmd->pool, 8, sizeof(char *));
ap_regname(r, conf->refs, 1); ap_regname(r, conf->refs, AP_REG_MATCH, 1);
} }
/* Make this explicit - the "/" root has 0 elements, that is, we /* Make this explicit - the "/" root has 0 elements, that is, we
@ -2304,7 +2304,7 @@ static const char *urlsection(cmd_parms *cmd, void *mconfig, const char *arg)
if (r) { if (r) {
conf->refs = apr_array_make(cmd->pool, 8, sizeof(char *)); conf->refs = apr_array_make(cmd->pool, 8, sizeof(char *));
ap_regname(r, conf->refs, 1); ap_regname(r, conf->refs, AP_REG_MATCH, 1);
} }
ap_add_per_url_conf(cmd->server, new_url_conf); ap_add_per_url_conf(cmd->server, new_url_conf);
@ -2391,7 +2391,7 @@ static const char *filesection(cmd_parms *cmd, void *mconfig, const char *arg)
if (r) { if (r) {
conf->refs = apr_array_make(cmd->pool, 8, sizeof(char *)); conf->refs = apr_array_make(cmd->pool, 8, sizeof(char *));
ap_regname(r, conf->refs, 1); ap_regname(r, conf->refs, AP_REG_MATCH, 1);
} }
ap_add_file_conf(cmd->pool, (core_dir_config *)mconfig, new_file_conf); ap_add_file_conf(cmd->pool, (core_dir_config *)mconfig, new_file_conf);

View File

@ -258,7 +258,8 @@ AP_DECLARE(int) ap_regexec_len(const ap_regex_t *preg, const char *buff,
} }
AP_DECLARE(int) ap_regname(const ap_regex_t *preg, AP_DECLARE(int) ap_regname(const ap_regex_t *preg,
apr_array_header_t *names, int upper) apr_array_header_t *names, const char *prefix,
int upper)
{ {
int namecount; int namecount;
int nameentrysize; int nameentrysize;
@ -278,10 +279,14 @@ AP_DECLARE(int) ap_regname(const ap_regex_t *preg,
while (names->nelts <= capture) { while (names->nelts <= capture) {
apr_array_push(names); apr_array_push(names);
} }
if (upper) { if (upper || prefix) {
char *name = ((char **)names->elts)[capture] = char *name = ((char **) names->elts)[capture] =
apr_pstrdup(names->pool, offset + 2); prefix ? apr_pstrcat(names->pool, prefix, offset + 2,
ap_str_toupper(name); NULL) :
apr_pstrdup(names->pool, offset + 2);
if (upper) {
ap_str_toupper(name);
}
} }
else { else {
((const char **)names->elts)[capture] = offset + 2; ((const char **)names->elts)[capture] = offset + 2;