Hi,
Attached is a patch which implements ap_document_root(r) as a hook.
This way modules can set document_root on the fly. (think vhost_alias)
AND get the right DOCUMENT_ROOT env. variable (as set by
ap_add_common_vars(r)).
The patch also changes ap_core_translate to use ap_document_root(r)
instead of conf-ap_document_root. This way, modules that just need
to point to a different docroot won't have to implement a translate
hook by appending r-uri til r-filename, but just rely on
ap_document_root.
Comments ?
/Jakob
Index: server/core.c
===
--- server/core.c (revision 530676)
+++ server/core.c (working copy)
@@ -69,12 +69,16 @@
APR_HOOK_STRUCT(
APR_HOOK_LINK(get_mgmt_items)
+APR_HOOK_LINK(document_root)
)
AP_IMPLEMENT_HOOK_RUN_ALL(int, get_mgmt_items,
(apr_pool_t *p, const char *val, apr_hash_t *ht),
(p, val, ht), OK, DECLINED)
+AP_IMPLEMENT_HOOK_RUN_FIRST(const char *,document_root,
+ (request_rec *r), (r), NULL)
+
/* Server core module... This module provides support for really basic
* server operations, including options and commands which control the
* operation of other modules. Consider this the bureaucracy module.
@@ -682,7 +686,7 @@
: DEFAULT_CONTENT_TYPE;
}
-AP_DECLARE(const char *) ap_document_root(request_rec *r) /* Don't use this! */
+AP_DECLARE(const char *) ap_core_document_root(request_rec *r)
{
core_server_config *conf;
@@ -3390,7 +3394,7 @@
while (*path == '/') {
++path;
}
-if ((rv = apr_filepath_merge(r-filename, conf-ap_document_root, path,
+if ((rv = apr_filepath_merge(r-filename, ap_document_root(r), path,
APR_FILEPATH_TRUENAME
| APR_FILEPATH_SECUREROOT, r-pool))
!= APR_SUCCESS) {
@@ -3413,7 +3417,7 @@
while (*path == '/') {
++path;
}
-if ((rv = apr_filepath_merge(r-filename, conf-ap_document_root, path,
+if ((rv = apr_filepath_merge(r-filename, ap_document_root(r), path,
APR_FILEPATH_TRUENAME
| APR_FILEPATH_SECUREROOT, r-pool))
!= APR_SUCCESS) {
@@ -3863,6 +3867,7 @@
APR_OPTIONAL_HOOK(proxy, create_req, core_create_proxy_req, NULL, NULL,
APR_HOOK_MIDDLE);
ap_hook_pre_mpm(ap_create_scoreboard, NULL, NULL, APR_HOOK_MIDDLE);
+ap_hook_document_root(ap_core_document_root, NULL, NULL, APR_HOOK_REALLY_LAST);
/* register the core's insert_filter hook and register core-provided
* filters
Index: include/http_core.h
===
--- include/http_core.h (revision 530676)
+++ include/http_core.h (working copy)
@@ -148,11 +148,10 @@
/**
* Retrieve the document root for this server
* @param r The current request
- * @warning Don't use this! If your request went through a Userdir, or
- * something like that, it'll screw you. But it's back-compatible...
* @return The document root
*/
-AP_DECLARE(const char *) ap_document_root(request_rec *r);
+AP_DECLARE(const char *) ap_core_document_root(request_rec *r);
+#define ap_document_root(r) ap_run_document_root(r)
/**
* Lookup the remote client's DNS name or IP address
@@ -629,6 +628,14 @@
AP_DECLARE_HOOK(int, get_mgmt_items,
(apr_pool_t *p, const char * val, apr_hash_t *ht))
+/**
+ * This hook allows modules to return customized documentroot
+ * @param r the current request
+ * @ingroup hooks
+ */
+AP_DECLARE_HOOK(const char*,document_root,(request_rec *r))
+
+
/* -- */
/* --