Return-Path: Delivered-To: apmail-httpd-cvs-archive@www.apache.org Received: (qmail 82375 invoked from network); 3 Apr 2008 10:23:47 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 3 Apr 2008 10:23:47 -0000 Received: (qmail 6472 invoked by uid 500); 3 Apr 2008 10:23:47 -0000 Delivered-To: apmail-httpd-cvs-archive@httpd.apache.org Received: (qmail 6270 invoked by uid 500); 3 Apr 2008 10:23:47 -0000 Mailing-List: contact cvs-help@httpd.apache.org; run by ezmlm Precedence: bulk Reply-To: dev@httpd.apache.org list-help: list-unsubscribe: List-Post: List-Id: Delivered-To: mailing list cvs@httpd.apache.org Received: (qmail 6259 invoked by uid 99); 3 Apr 2008 10:23:46 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 03 Apr 2008 03:23:46 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 03 Apr 2008 10:23:03 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id BB3D81A9832; Thu, 3 Apr 2008 03:23:22 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r644253 - in /httpd/httpd/trunk: docs/manual/mod/core.xml include/ap_mmn.h include/http_core.h server/core.c server/request.c Date: Thu, 03 Apr 2008 10:23:18 -0000 To: cvs@httpd.apache.org From: niq@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080403102322.BB3D81A9832@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: niq Date: Thu Apr 3 03:23:12 2008 New Revision: 644253 URL: http://svn.apache.org/viewvc?rev=644253&view=rev Log: HTTPD Core: Implement sections for conditional (runtime) configuration. N.B. This is a first pass, and has a way to go! Modified: httpd/httpd/trunk/docs/manual/mod/core.xml httpd/httpd/trunk/include/ap_mmn.h httpd/httpd/trunk/include/http_core.h httpd/httpd/trunk/server/core.c httpd/httpd/trunk/server/request.c Modified: httpd/httpd/trunk/docs/manual/mod/core.xml URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/manual/mod/core.xml?rev=644253&r1=644252&r2=644253&view=diff ============================================================================== --- httpd/httpd/trunk/docs/manual/mod/core.xml (original) +++ httpd/httpd/trunk/docs/manual/mod/core.xml Thu Apr 3 03:23:12 2008 @@ -1304,6 +1304,36 @@ +If +Contains directives that apply only if a condition is +satisfied by a request at runtime +<If expression> ... </If> +server configvirtual host +directory.htaccess + +All + + +

The If directive + evaluates an expression at runtime, and applies the enclosed + directives if and only if the expression evaluates to true. + For example:

+ + + <If "$req{Host} = ''"> + + +

would match HTTP/1.0 requests without a Host: header.

+
+ +How <Directory>, <Location>, + <Files> sections work for an explanation of how these + different sections are combined when a request is received. + If has the same precedence + and usage as Files +
+ + IfDefine Encloses directives that will be processed only if a test is true at startup @@ -1633,7 +1663,8 @@ LOCK, and UNLOCK. The method name is case-sensitive. If GET is used it will also restrict HEAD requests. The TRACE method - cannot be limited.

+ cannot be limited (see TraceEnable).

A LimitExcept section should always be Modified: httpd/httpd/trunk/include/ap_mmn.h URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/include/ap_mmn.h?rev=644253&r1=644252&r2=644253&view=diff ============================================================================== --- httpd/httpd/trunk/include/ap_mmn.h (original) +++ httpd/httpd/trunk/include/ap_mmn.h Thu Apr 3 03:23:12 2008 @@ -151,6 +151,8 @@ * 20071108.9 (2.3.0-dev) Add chroot support to unixd_config * 20071108.10(2.3.0-dev) Introduce new ap_expr API * 20071108.11(2.3.0-dev) Revise/Expand new ap_expr API + * 20071108.12(2.3.0-dev) Remove ap_expr_clone from the API (same day it was added) + * 20000403.0 (2.3.0-dev) Add condition field to core dir config */ #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */ @@ -158,7 +160,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 20071108 #endif -#define MODULE_MAGIC_NUMBER_MINOR 11 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 0 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a Modified: httpd/httpd/trunk/include/http_core.h URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/include/http_core.h?rev=644253&r1=644252&r2=644253&view=diff ============================================================================== --- httpd/httpd/trunk/include/http_core.h (original) +++ httpd/httpd/trunk/include/http_core.h Thu Apr 3 03:23:12 2008 @@ -30,6 +30,7 @@ #include "apr_hash.h" #include "apr_optional.h" #include "util_filter.h" +#include "ap_expr.h" #if APR_HAVE_STRUCT_RLIMIT #include @@ -541,6 +542,7 @@ #define USE_CANONICAL_PHYS_PORT_UNSET (2) unsigned use_canonical_phys_port : 2; + ap_parse_node_t *condition; /* Conditionally merge sections */ } core_dir_config; /* Per-server core configuration */ Modified: httpd/httpd/trunk/server/core.c URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/core.c?rev=644253&r1=644252&r2=644253&view=diff ============================================================================== --- httpd/httpd/trunk/server/core.c (original) +++ httpd/httpd/trunk/server/core.c Thu Apr 3 03:23:12 2008 @@ -1995,6 +1995,71 @@ return NULL; } +static const char *ifsection(cmd_parms *cmd, void *mconfig, const char *arg) +{ + const char *errmsg; + const char *endp = ap_strrchr_c(arg, '>'); + int old_overrides = cmd->override; + char *old_path = cmd->path; + core_dir_config *conf; + ap_regex_t *r = NULL; + const command_rec *thiscmd = cmd->cmd; + core_dir_config *c = mconfig; + ap_conf_vector_t *new_file_conf = ap_create_per_dir_config(cmd->pool); + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT|NOT_IN_LOCATION); + const char *condition; + int expr_err = 0; + + if (err != NULL) { + return err; + } + + if (endp == NULL) { + return unclosed_directive(cmd); + } + + arg = apr_pstrndup(cmd->pool, arg, endp - arg); + + if (!arg[0]) { + return missing_container_arg(cmd); + } + + //cmd->path = "*"; + condition = ap_getword_conf(cmd->pool, &arg); + /* Only if not an .htaccess file */ + if (!old_path) { + cmd->override = OR_ALL|ACCESS_CONF; + } + + /* initialize our config and fetch it */ + conf = ap_set_config_vectors(cmd->server, new_file_conf, cmd->path, + &core_module, cmd->pool); + + conf->condition = ap_expr_parse(cmd->pool, condition, &expr_err); + if (expr_err) { + return "Cannot parse condition clause"; + } + + errmsg = ap_walk_config(cmd->directive->first_child, cmd, new_file_conf); + if (errmsg != NULL) + return errmsg; + + conf->d = cmd->path; + conf->d_is_fnmatch = 0; + conf->r = NULL; + + ap_add_file_conf(c, new_file_conf); + + if (*arg != '\0') { + return apr_pstrcat(cmd->pool, "Multiple ", thiscmd->name, + "> arguments not supported.", NULL); + } + + cmd->path = old_path; + cmd->override = old_overrides; + + return NULL; +} static const char *start_ifmod(cmd_parms *cmd, void *mconfig, const char *arg) { @@ -3209,6 +3274,8 @@ "Set to on or off for PATH_INFO to be accepted by handlers, or default for the per-handler preference"), AP_INIT_TAKE1("Define", set_define, NULL, RSRC_CONF, "Define the existance of a variable. Same as passing -D to the command line."), +AP_INIT_RAW_ARGS("r - ? ap_regexec(entry_core->r, cache->cached , 0, NULL, 0) - : (entry_core->d_is_fnmatch - ? apr_fnmatch(entry_core->d, cache->cached, APR_FNM_PATHNAME) - : strcmp(entry_core->d, cache->cached))) { - continue; + if (entry_core->condition) { + if (!ap_expr_eval(r, entry_core->condition, &err, NULL, + ap_expr_string, NULL)) { + continue; + } + } + else { + if (entry_core->r + ? ap_regexec(entry_core->r, cache->cached , 0, NULL, 0) + : (entry_core->d_is_fnmatch + ? apr_fnmatch(entry_core->d, cache->cached, APR_FNM_PATHNAME) + : strcmp(entry_core->d, cache->cached))) { + continue; + } } /* If we merged this same section last time, reuse it