#define OPTION_IGNORE_INHERIT (1<<8)
#define OPTION_IGNORE_CONTEXT_INFO (1<<9)
#define OPTION_LEGACY_PREFIX_DOCROOT (1<<10)
+#define OPTION_LONGOPT (1<<11)
#ifndef RAND_MAX
#define RAND_MAX 32767
char *perdir;
backrefinfo briRR;
backrefinfo briRC;
+ apr_pool_t *temp_pool;
} rewrite_ctx;
/*
* are interpreted by a later expansion, producing results that
* were not intended by the administrator.
*/
-static char *do_expand(char *input, rewrite_ctx *ctx, rewriterule_entry *entry)
+static char *do_expand(char *input, rewrite_ctx *ctx, rewriterule_entry *entry, apr_pool_t *pool)
{
result_list *result, *current;
result_list sresult[SMALL_EXPANSION];
unsigned spc = 0;
apr_size_t span, inputlen, outlen;
char *p, *c;
- apr_pool_t *pool = ctx->r->pool;
span = strcspn(input, "\\$%");
inputlen = strlen(input);
}
/* reuse of key variable as result */
- key = lookup_map(ctx->r, map, do_expand(key, ctx, entry));
+ key = lookup_map(ctx->r, map, do_expand(key, ctx, entry, pool));
if (!key && dflt && *dflt) {
- key = do_expand(dflt, ctx, entry);
+ key = do_expand(dflt, ctx, entry, pool);
}
if (key) {
char *name, *val;
while (env) {
- name = do_expand(env->data, ctx, NULL);
+ name = do_expand(env->data, ctx, NULL, ctx->r->pool);
if (*name == '!') {
name++;
apr_table_unset(ctx->r->subprocess_env, name);
static void do_expand_cookie(data_item *cookie, rewrite_ctx *ctx)
{
while (cookie) {
- add_cookie(ctx->r, do_expand(cookie->data, ctx, NULL));
+ add_cookie(ctx->r, do_expand(cookie->data, ctx, NULL, ctx->r->pool));
cookie = cookie->next;
}
else if (!strcasecmp(w, "legacyprefixdocroot")) {
options |= OPTION_LEGACY_PREFIX_DOCROOT;
}
+ else if (!strcasecmp(w, "LongURLOptimization")) {
+ options |= OPTION_LONGOPT;
+ }
else {
return apr_pstrcat(cmd->pool, "RewriteOptions: unknown option '",
w, "'", NULL);
/*
* Apply a single rewriteCond
*/
-static int apply_rewrite_cond(rewritecond_entry *p, rewrite_ctx *ctx)
+static int apply_rewrite_cond(rewritecond_entry *p, rewrite_ctx *ctx, apr_pool_t *pool)
{
char *input = NULL;
apr_finfo_t sb;
int basis;
if (p->ptype != CONDPAT_AP_EXPR)
- input = do_expand(p->input, ctx, NULL);
+ input = do_expand(p->input, ctx, NULL, pool);
switch (p->ptype) {
case CONDPAT_FILE_EXISTS:
char *expanded;
if (p->forced_mimetype) {
- expanded = do_expand(p->forced_mimetype, ctx, p);
+ expanded = do_expand(p->forced_mimetype, ctx, p, ctx->r->pool);
if (*expanded) {
ap_str_tolower(expanded);
}
if (p->forced_handler) {
- expanded = do_expand(p->forced_handler, ctx, p);
+ expanded = do_expand(p->forced_handler, ctx, p, ctx->r->pool);
if (*expanded) {
ap_str_tolower(expanded);
for (i = 0; i < rewriteconds->nelts; ++i) {
rewritecond_entry *c = &conds[i];
- rc = apply_rewrite_cond(c, ctx);
+ rc = apply_rewrite_cond(c, ctx, ctx->temp_pool ? ctx->temp_pool : r->pool);
/*
* Reset vary_this if the novary flag is set for this condition.
*/
}
}
else if (!rc) {
+ if (ctx->temp_pool) {
+ apr_pool_clear(ctx->temp_pool);
+ }
return 0;
}
/* expand the result */
if (!(p->flags & RULEFLAG_NOSUB)) {
- newuri = do_expand(p->output, ctx, p);
+ newuri = do_expand(p->output, ctx, p, ctx->r->pool);
rewritelog((r, 2, ctx->perdir, "rewrite '%s' -> '%s'", ctx->uri,
newuri));
}
int s;
rewrite_ctx *ctx;
int round = 1;
+ rewrite_server_conf *sconf = ap_get_module_config(
+ r->server->module_config, &rewrite_module);
ctx = apr_palloc(r->pool, sizeof(*ctx));
ctx->perdir = perdir;
ctx->r = r;
+ if (sconf->options & OPTION_LONGOPT) {
+ apr_pool_create(&(ctx->temp_pool), r->pool);
+ }
+ else {
+ ctx->temp_pool = NULL;
+ }
+
/*
* Iterate over all existing rules
*/