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