mod_rewrite.h revision 1b21d7b3d97def358b2e923655edeb16613a1c31
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding/* ====================================================================
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * The Apache Software License, Version 1.1
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding *
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * Copyright (c) 2000 The Apache Software Foundation. All rights
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * reserved.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding *
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * Redistribution and use in source and binary forms, with or without
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * modification, are permitted provided that the following conditions
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * are met:
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding *
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * 1. Redistributions of source code must retain the above copyright
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * notice, this list of conditions and the following disclaimer.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding *
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * 2. Redistributions in binary form must reproduce the above copyright
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * notice, this list of conditions and the following disclaimer in
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * the documentation and/or other materials provided with the
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * distribution.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding *
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * 3. The end-user documentation included with the redistribution,
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * if any, must include the following acknowledgment:
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * "This product includes software developed by the
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * Apache Software Foundation (http://www.apache.org/)."
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * Alternately, this acknowledgment may appear in the software itself,
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * if and wherever such third-party acknowledgments normally appear.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding *
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * 4. The names "Apache" and "Apache Software Foundation" must
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * not be used to endorse or promote products derived from this
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * software without prior written permission. For written
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * permission, please contact apache@apache.org.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding *
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * 5. Products derived from this software may not be called "Apache",
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * nor may "Apache" appear in their name, without prior written
64185f9824e42f21ca7b9ae6c004484215c031a7rbb * permission of the Apache Software Foundation.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding *
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * SUCH DAMAGE.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * ====================================================================
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding *
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * This software consists of voluntary contributions made by many
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * individuals on behalf of the Apache Software Foundation. For more
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * information on the Apache Software Foundation, please see
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * <http://www.apache.org/>.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding *
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * Portions of this software are based upon public domain software
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * originally written at the National Center for Supercomputing Applications,
ab2c1c1c83ec91415565da5a71fbc15d9685caa6fielding * University of Illinois, Urbana-Champaign.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
1b21d7b3d97def358b2e923655edeb16613a1c31gstein#ifndef MOD_REWRITE_H
1b21d7b3d97def358b2e923655edeb16613a1c31gstein#define MOD_REWRITE_H 1
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding/*
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** _ _ _
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** _ __ ___ ___ __| | _ __ _____ ___ __(_) |_ ___
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** | '_ ` _ \ / _ \ / _` | | '__/ _ \ \ /\ / / '__| | __/ _ \
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** | | | | | | (_) | (_| | | | | __/\ V V /| | | | || __/
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** |_| |_| |_|\___/ \__,_|___|_| \___| \_/\_/ |_| |_|\__\___|
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** |_____|
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding**
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** URL Rewriting Module
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding**
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** This module uses a rule-based rewriting engine (based on a
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** regular-expression parser) to rewrite requested URLs on the fly.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding**
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** It supports an unlimited number of additional rule conditions (which can
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** operate on a lot of variables, even on HTTP headers) for granular
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** matching and even external database lookups (either via plain text
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** tables, DBM hash files or even external processes) for advanced URL
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** substitution.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding**
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** It operates on the full URLs (including the PATH_INFO part) both in
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** per-server context (httpd.conf) and per-dir context (.htaccess) and even
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** can generate QUERY_STRING parts on result. The rewriting result finally
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** can lead to internal subprocessing, external request redirection or even
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** to internal proxy throughput.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding**
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** This module was originally written in April 1996 and
64185f9824e42f21ca7b9ae6c004484215c031a7rbb** gifted exclusively to the The Apache Software Foundation in July 1997 by
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding**
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** Ralf S. Engelschall
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** rse@engelschall.com
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** www.engelschall.com
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding*/
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
1b21d7b3d97def358b2e923655edeb16613a1c31gstein#include "apr.h"
1b21d7b3d97def358b2e923655edeb16613a1c31gstein
1b21d7b3d97def358b2e923655edeb16613a1c31gstein#define APR_WANT_STRFUNC
1b21d7b3d97def358b2e923655edeb16613a1c31gstein#define APR_WANT_MEMFUNC
1b21d7b3d97def358b2e923655edeb16613a1c31gstein#include "apr_want.h"
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* Include from the underlaying Unix system ... */
1b21d7b3d97def358b2e923655edeb16613a1c31gstein#if APR_HAVE_STDARG_H
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#include <stdarg.h>
48d7c43629323c8d5ee9f7bd0d194de0a376b391rbb#endif
1b21d7b3d97def358b2e923655edeb16613a1c31gstein#if APR_HAVE_STDLIB_H
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#include <stdlib.h>
48d7c43629323c8d5ee9f7bd0d194de0a376b391rbb#endif
1b21d7b3d97def358b2e923655edeb16613a1c31gstein#if APR_HAVE_CTYPE_H
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#include <ctype.h>
48d7c43629323c8d5ee9f7bd0d194de0a376b391rbb#endif
1b21d7b3d97def358b2e923655edeb16613a1c31gstein#if APR_HAVE_SYS_TYPES_H
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#include <sys/types.h>
0c0afda9ab1830cc440f25b755aa363d23b20dd5dgaudet#endif
1b21d7b3d97def358b2e923655edeb16613a1c31gstein
1b21d7b3d97def358b2e923655edeb16613a1c31gstein#include "ap_config.h"
1b21d7b3d97def358b2e923655edeb16613a1c31gstein
1b21d7b3d97def358b2e923655edeb16613a1c31gstein#ifdef HAVE_TIME_H
1b21d7b3d97def358b2e923655edeb16613a1c31gstein#include <time.h>
1b21d7b3d97def358b2e923655edeb16613a1c31gstein#endif
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* Include from the Apache server ... */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define CORE_PRIVATE
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#include "httpd.h"
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#include "http_config.h"
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#include "http_request.h"
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#include "http_core.h"
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#include "http_log.h"
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#include "http_vhost.h"
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /*
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm * The key in the r->notes apr_table_t wherein we store our accumulated
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * Vary values, and the one used for per-condition checks in a chain.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define VARY_KEY "rewrite-Vary"
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define VARY_KEY_THIS "rewrite-Vary-this"
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* The NDBM support:
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * We support only NDBM files.
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * But we have to stat the file for the mtime,
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * so we also need to know the file extension
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#ifndef NO_DBM_REWRITEMAP
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#if defined(__GLIBC__) && defined(__GLIBC_MINOR__) \
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#include <db1/ndbm.h>
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#else
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#include <ndbm.h>
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#endif
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#if defined(DBM_SUFFIX)
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define NDBM_FILE_SUFFIX DBM_SUFFIX
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#elif defined(__FreeBSD__) || (defined(DB_LOCK) && defined(DB_SHMEM))
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define NDBM_FILE_SUFFIX ".db"
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#else
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define NDBM_FILE_SUFFIX ".pag"
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#endif
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#endif
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding/*
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding**
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** Some defines
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding**
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding*/
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define ENVVAR_SCRIPT_URL "SCRIPT_URL"
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define ENVVAR_SCRIPT_URI "SCRIPT_URI"
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#ifndef SUPPORT_DBM_REWRITEMAP
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define SUPPORT_DBM_REWRITEMAP 0
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#endif
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define REWRITE_FORCED_MIMETYPE_NOTEVAR "rewrite-forced-mimetype"
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define CONDFLAG_NONE 1<<0
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define CONDFLAG_NOCASE 1<<1
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define CONDFLAG_NOTMATCH 1<<2
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define CONDFLAG_ORNEXT 1<<3
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define RULEFLAG_NONE 1<<0
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define RULEFLAG_FORCEREDIRECT 1<<1
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define RULEFLAG_LASTRULE 1<<2
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define RULEFLAG_NEWROUND 1<<3
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define RULEFLAG_CHAIN 1<<4
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define RULEFLAG_IGNOREONSUBREQ 1<<5
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define RULEFLAG_NOTMATCH 1<<6
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define RULEFLAG_PROXY 1<<7
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define RULEFLAG_PASSTHROUGH 1<<8
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define RULEFLAG_FORBIDDEN 1<<9
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define RULEFLAG_GONE 1<<10
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define RULEFLAG_QSAPPEND 1<<11
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define RULEFLAG_NOCASE 1<<12
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define MAPTYPE_TXT 1<<0
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define MAPTYPE_DBM 1<<1
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define MAPTYPE_PRG 1<<2
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define MAPTYPE_INT 1<<3
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define MAPTYPE_RND 1<<4
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define ENGINE_DISABLED 1<<0
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define ENGINE_ENABLED 1<<1
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define OPTION_NONE 1<<0
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define OPTION_INHERIT 1<<1
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define CACHEMODE_TS 1<<0
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define CACHEMODE_TTL 1<<1
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define CACHE_TLB_ROWS 1024
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define CACHE_TLB_COLS 4
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
b5aed57c02a923d92b17122fa780bb5f2f14801ddougm#ifndef FALSE
b5aed57c02a923d92b17122fa780bb5f2f14801ddougm#define FALSE 0
b5aed57c02a923d92b17122fa780bb5f2f14801ddougm#define TRUE !FALSE
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#endif
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#ifndef NO
b5aed57c02a923d92b17122fa780bb5f2f14801ddougm#define NO FALSE
b5aed57c02a923d92b17122fa780bb5f2f14801ddougm#define YES TRUE
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#endif
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#ifndef RAND_MAX
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define RAND_MAX 32767
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#endif
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#ifndef LONG_STRING_LEN
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define LONG_STRING_LEN 2048
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#endif
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define MAX_ENV_FLAGS 15
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#define MAX_NMATCH 10
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding/*
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding**
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** our private data structures we handle with
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding**
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding*/
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* the list structures for holding the mapfile information
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * and the rewrite rules
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding */
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingtypedef struct {
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawick const char *name; /* the name of the map */
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawick const char *datafile; /* filename for map data files */
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawick const char *checkfile; /* filename to check for map existence */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding int type; /* the type of the map */
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_file_t *fpin; /* in file pointer for program maps */
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_file_t *fpout; /* out file pointer for program maps */
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_file_t *fperr; /* err file pointer for program maps */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *(*func)(request_rec *, /* function pointer for internal maps */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding} rewritemap_entry;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingtypedef struct {
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *input; /* Input string of RewriteCond */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *pattern; /* the RegExp pattern string */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding regex_t *regexp;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding int flags; /* Flags which control the match */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding} rewritecond_entry;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingtypedef struct {
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_array_header_t *rewriteconds; /* the corresponding RewriteCond entries */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *pattern; /* the RegExp pattern string */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding regex_t *regexp; /* the RegExp pattern compilation */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *output; /* the Substitution string */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding int flags; /* Flags which control the substitution */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *forced_mimetype; /* forced MIME type of substitution */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding int forced_responsecode; /* forced HTTP redirect response status */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *env[MAX_ENV_FLAGS+1]; /* added environment variables */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding int skip; /* number of next rules to skip */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding} rewriterule_entry;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* the per-server or per-virtual-server configuration
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * statically generated once on startup for every server
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding */
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingtypedef struct {
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding int state; /* the RewriteEngine state */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding int options; /* the RewriteOption state */
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawick const char *rewritelogfile; /* the RewriteLog filename */
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawick apr_file_t *rewritelogfp; /* the RewriteLog open filepointer */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding int rewriteloglevel; /* the RewriteLog level of verbosity */
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_array_header_t *rewritemaps; /* the RewriteMap entries */
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_array_header_t *rewriteconds; /* the RewriteCond entries (temporary) */
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_array_header_t *rewriterules; /* the RewriteRule entries */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding server_rec *server; /* the corresponding server indicator */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding} rewrite_server_conf;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* the per-directory configuration
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * generated on-the-fly by Apache server for current request
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding */
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingtypedef struct {
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding int state; /* the RewriteEngine state */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding int options; /* the RewriteOption state */
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_array_header_t *rewriteconds; /* the RewriteCond entries (temporary) */
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_array_header_t *rewriterules; /* the RewriteRule entries */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *directory; /* the directory where it applies */
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawick const char *baseurl; /* the base-URL where it applies */
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding} rewrite_perdir_conf;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* the cache structures,
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm * a 4-way hash apr_table_t with LRU functionality
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding */
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingtypedef struct cacheentry {
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding time_t time;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *key;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *value;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding} cacheentry;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingtypedef struct tlbentry {
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding int t[CACHE_TLB_COLS];
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding} cachetlbentry;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingtypedef struct cachelist {
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *resource;
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_array_header_t *entries;
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_array_header_t *tlb;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding} cachelist;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingtypedef struct cache {
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_pool_t *pool;
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_array_header_t *lists;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding} cache;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* the regex structure for the
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding * substitution of backreferences
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding */
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingtypedef struct backrefinfo {
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *source;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding int nsub;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding regmatch_t regmatch[10];
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding} backrefinfo;
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding/*
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding**
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding** forward declarations
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding**
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding*/
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* config structure handling */
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic void *config_server_create(apr_pool_t *p, server_rec *s);
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic void *config_server_merge (apr_pool_t *p, void *basev, void *overridesv);
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic void *config_perdir_create(apr_pool_t *p, char *path);
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic void *config_perdir_merge (apr_pool_t *p, void *basev, void *overridesv);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* config directive handling */
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic const char *cmd_rewriteengine(cmd_parms *cmd,
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawick void *dconf, int flag);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic const char *cmd_rewriteoptions(cmd_parms *cmd,
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawick void *dconf,
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawick const char *option);
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic const char *cmd_rewriteoptions_setoption(apr_pool_t *p, int *options,
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawick const char *name);
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawickstatic const char *cmd_rewritelog (cmd_parms *cmd, void *dconf, const char *a1);
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawickstatic const char *cmd_rewriteloglevel(cmd_parms *cmd, void *dconf, const char *a1);
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawickstatic const char *cmd_rewritemap (cmd_parms *cmd, void *dconf,
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawick const char *a1, const char *a2);
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawickstatic const char *cmd_rewritelock(cmd_parms *cmd, void *dconf, const char *a1);
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawickstatic const char *cmd_rewritebase(cmd_parms *cmd, void *dconf,
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawick const char *a1);
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawickstatic const char *cmd_rewritecond(cmd_parms *cmd, void *dconf,
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawick const char *str);
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic const char *cmd_rewritecond_parseflagfield(apr_pool_t *p,
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding rewritecond_entry *new,
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *str);
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic const char *cmd_rewritecond_setflag(apr_pool_t *p, rewritecond_entry *cfg,
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *key, char *val);
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawickstatic const char *cmd_rewriterule(cmd_parms *cmd, void *dconf,
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawick const char *str);
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic const char *cmd_rewriterule_parseflagfield(apr_pool_t *p,
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding rewriterule_entry *new,
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *str);
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic const char *cmd_rewriterule_setflag(apr_pool_t *p, rewriterule_entry *cfg,
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *key, char *val);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* initialisation */
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic void init_module(apr_pool_t *p,
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_pool_t *plog,
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_pool_t *ptemp,
895b674fa4e5a4c8fcbcb4e7b30630857653c149dgaudet server_rec *s);
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic void init_child(apr_pool_t *p, server_rec *s);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* runtime hooks */
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic int hook_uri2file (request_rec *r);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic int hook_mimetype (request_rec *r);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic int hook_fixup (request_rec *r);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic int handler_redirect(request_rec *r);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* rewriting engine */
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic int apply_rewrite_list(request_rec *r, apr_array_header_t *rewriterules,
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *perdir);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic int apply_rewrite_rule(request_rec *r, rewriterule_entry *p,
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *perdir);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic int apply_rewrite_cond(request_rec *r, rewritecond_entry *p,
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *perdir, backrefinfo *briRR,
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding backrefinfo *briRC);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
338557e3bec207b00891e78a0aa003a9aaf7b581fanfstatic void do_expand(request_rec *r, char *input, char *buffer, int nbuf,
338557e3bec207b00891e78a0aa003a9aaf7b581fanf backrefinfo *briRR, backrefinfo *briRC);
338557e3bec207b00891e78a0aa003a9aaf7b581fanfstatic void do_expand_env(request_rec *r, char *env[],
338557e3bec207b00891e78a0aa003a9aaf7b581fanf backrefinfo *briRR, backrefinfo *briRC);
338557e3bec207b00891e78a0aa003a9aaf7b581fanf
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* URI transformation function */
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic void splitout_queryargs(request_rec *r, int qsappend);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic void fully_qualify_uri(request_rec *r);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic void reduce_uri(request_rec *r);
338557e3bec207b00891e78a0aa003a9aaf7b581fanfstatic int is_absolute_uri(char *uri);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic char *expand_tildepaths(request_rec *r, char *uri);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* rewrite map support functions */
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic char *lookup_map(request_rec *r, char *name, char *key);
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawickstatic char *lookup_map_txtfile(request_rec *r, const char *file, char *key);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#ifndef NO_DBM_REWRITEMAP
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawickstatic char *lookup_map_dbmfile(request_rec *r, const char *file, char *key);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding#endif
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic char *lookup_map_program(request_rec *r, apr_file_t *fpin,
1ccd992d37d62c8cb2056126f2234f64ec189bfddougm apr_file_t *fpout, char *key);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic char *lookup_map_internal(request_rec *r,
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *(*func)(request_rec *r, char *key),
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *key);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic char *rewrite_mapfunc_toupper(request_rec *r, char *key);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic char *rewrite_mapfunc_tolower(request_rec *r, char *key);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic char *rewrite_mapfunc_escape(request_rec *r, char *key);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic char *rewrite_mapfunc_unescape(request_rec *r, char *key);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic char *select_random_value_part(request_rec *r, char *value);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic void rewrite_rand_init(void);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic int rewrite_rand(int l, int h);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* rewriting logfile support */
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic void open_rewritelog(server_rec *s, apr_pool_t *p);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic void rewritelog(request_rec *r, int level, const char *text, ...)
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding __attribute__((format(printf,3,4)));
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic char *current_logtime(request_rec *r);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* rewriting lockfile support */
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic void rewritelock_create(server_rec *s, apr_pool_t *p);
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic apr_status_t rewritelock_remove(void *data);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* program map support */
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic void run_rewritemap_programs(server_rec *s, apr_pool_t *p);
f0b8dcb0a0d70f8c9fc59d99fb3b235f4571a5cbtrawickstatic apr_status_t rewritemap_program_child(apr_pool_t *p, const char *progname,
f0b8dcb0a0d70f8c9fc59d99fb3b235f4571a5cbtrawick apr_file_t **fpout, apr_file_t **fpin,
f0b8dcb0a0d70f8c9fc59d99fb3b235f4571a5cbtrawick apr_file_t **fperr);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* env variable support */
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic char *lookup_variable(request_rec *r, char *var);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic char *lookup_header(request_rec *r, const char *name);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* caching functions */
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic cache *init_cache(apr_pool_t *p);
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawickstatic char *get_cache_string(cache *c, const char *res, int mode, time_t mtime,
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *key);
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawickstatic void set_cache_string(cache *c, const char *res, int mode, time_t mtime,
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding char *key, char *value);
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawickstatic cacheentry *retrieve_cache_string(cache *c, const char *res, char *key);
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawickstatic void store_cache_string(cache *c, const char *res, cacheentry *ce);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* misc functions */
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic char *subst_prefix_path(request_rec *r, char *input, char *match,
e5e42830f51e7307fb36c7908a22d6e530903a3ctrawick const char *subst);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic int parseargline(char *str, char **a1, char **a2, char **a3);
1ccd992d37d62c8cb2056126f2234f64ec189bfddougmstatic int prefix_stat(const char *path, apr_finfo_t *sb);
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic void add_env_variable(request_rec *r, char *s);
338557e3bec207b00891e78a0aa003a9aaf7b581fanfstatic int subreq_ok(request_rec *r);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding /* Lexicographic Comparison */
0f081398cf0eef8cc7c66a535d450110a92dc8aefieldingstatic int compare_lexicography(char *cpNum1, char *cpNum2);
0f081398cf0eef8cc7c66a535d450110a92dc8aefielding
8ba9d5e9aaaa79dba0de13f5c1b6e725d98f1dc2fanf /* Bracketed expression handling */
254becf0cdcf0d9631da62ae317c477f6366119cfanfstatic char *find_closing_bracket(char *s, int left, int right);
8ba9d5e9aaaa79dba0de13f5c1b6e725d98f1dc2fanfstatic char *find_char_in_brackets(char *s, int c, int left, int right);
254becf0cdcf0d9631da62ae317c477f6366119cfanf
1b21d7b3d97def358b2e923655edeb16613a1c31gstein#endif /* MOD_REWRITE_H */