diff --git a/docs/manual/developer/modguide.xml b/docs/manual/developer/modguide.xml
index 8ceebcdf78..1b517411ca 100644
--- a/docs/manual/developer/modguide.xml
+++ b/docs/manual/developer/modguide.xml
@@ -237,6 +237,7 @@ can create. Some other ways of hooking are:
ap_hook_child_init
: Place a hook that executes when a child process is spawned (commonly used for initializing modules after the server has forked)
ap_hook_pre_config
: Place a hook that executes before any configuration data has been read (very early hook)
ap_hook_post_config
: Place a hook that executes after configuration has been parsed, but before the server has forked
+ap_hook_pre_translate_name
: Place a hook that executes when a URI needs to be translated into a filename on the server, before decoding
ap_hook_translate_name
: Place a hook that executes when a URI needs to be translated into a filename on the server (think mod_rewrite
)
ap_hook_quick_handler
: Similar to ap_hook_handler
, except it is run before any other request hooks (translation, auth, fixups etc)
ap_hook_log_transaction
: Place a hook that executes when the server is about to add a log entry of the current request
diff --git a/docs/manual/mod/mod_log_debug.xml b/docs/manual/mod/mod_log_debug.xml
index e992533461..c2280b4d0a 100644
--- a/docs/manual/mod/mod_log_debug.xml
+++ b/docs/manual/mod/mod_log_debug.xml
@@ -103,6 +103,7 @@
Name |
+ pre_translate_name |
translate_name |
type_checker |
quick_handler |
diff --git a/docs/manual/mod/mod_lua.xml b/docs/manual/mod/mod_lua.xml
index 98a315fe5b..9baa8fa6c1 100644
--- a/docs/manual/mod/mod_lua.xml
+++ b/docs/manual/mod/mod_lua.xml
@@ -215,6 +215,13 @@ performing access control, or setting mime types:
This is the first hook that will be called after a request has
been mapped to a host or virtual host |
+
+ Pre-Translate name |
+ LuaHookPreTranslateName |
+ This phase translates the requested URI into a filename on the
+ system, before decoding occurs. Modules such as mod_proxy
+ can operate in this phase. |
+
Translate name |
LuaHookTranslateName |
@@ -439,7 +446,7 @@ end
string |
yes |
The file name that the request maps to, f.x. /www/example.com/foo.txt. This can be
- changed in the translate-name or map-to-storage phases of a request to allow the
+ changed in the pre-translate-name, translate-name or map-to-storage phases of a request to allow the
default handler (or script handlers) to serve a different file than what was requested. |
@@ -538,7 +545,7 @@ end
string |
yes |
Denotes whether this is a proxy request or not. This value is generally set in
- the post_read_request/translate_name phase of a request. |
+ the post_read_request/pre_translate_name/translate_name phase of a request.
range |
@@ -1516,6 +1523,23 @@ end
+
+LuaHookPreTranslate
+Provide a hook for the pre_translate phase of a request
+processing
+LuaHookPreTranslate /path/to/lua/script.lua hook_function_name
+server configvirtual host
+directory.htaccess
+
+All
+
+
+ Just like LuaHookTranslateName, but executed at the pre_translate phase,
+ where the URI-path is not percent decoded.
+
+
+
+
LuaHookFixups
Provide a hook for the fixups phase of a request
diff --git a/modules/examples/mod_example_hooks.c b/modules/examples/mod_example_hooks.c
index b6a12cb4b5..ec1df2b665 100644
--- a/modules/examples/mod_example_hooks.c
+++ b/modules/examples/mod_example_hooks.c
@@ -1174,6 +1174,22 @@ static int x_post_read_request(request_rec *r)
return DECLINED;
}
+/*
+ * This routine gives our module an opportunity to translate the URI into an
+ * actual filename, before URL decoding happens.
+ *
+ * This is a RUN_FIRST hook.
+ */
+static int x_pre_translate_name(request_rec *r)
+{
+ /*
+ * We don't actually *do* anything here, except note the fact that we were
+ * called.
+ */
+ trace_request(r, "x_pre_translate_name()");
+ return DECLINED;
+}
+
/*
* This routine gives our module an opportunity to translate the URI into an
* actual filename. If we don't do anything special, the server's default
@@ -1467,6 +1483,7 @@ static void x_register_hooks(apr_pool_t *p)
ap_hook_log_transaction(x_log_transaction, NULL, NULL, APR_HOOK_MIDDLE);
ap_hook_http_scheme(x_http_scheme, NULL, NULL, APR_HOOK_MIDDLE);
ap_hook_default_port(x_default_port, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_pre_translate_name(x_pre_translate_name, NULL, NULL, APR_HOOK_MIDDLE);
ap_hook_translate_name(x_translate_name, NULL, NULL, APR_HOOK_MIDDLE);
ap_hook_map_to_storage(x_map_to_storage, NULL,NULL, APR_HOOK_MIDDLE);
ap_hook_header_parser(x_header_parser, NULL, NULL, APR_HOOK_MIDDLE);
diff --git a/modules/generators/mod_info.c b/modules/generators/mod_info.c
index 1505b1a15d..90c84d03f2 100644
--- a/modules/generators/mod_info.c
+++ b/modules/generators/mod_info.c
@@ -322,6 +322,7 @@ static const hook_lookup_t request_hooks[] = {
{"HTTP Scheme", ap_hook_get_http_scheme},
{"Default Port", ap_hook_get_default_port},
{"Quick Handler", ap_hook_get_quick_handler},
+ {"Pre-Translate Name", ap_hook_get_pre_translate_name},
{"Translate Name", ap_hook_get_translate_name},
{"Map to Storage", ap_hook_get_map_to_storage},
{"Check Access", ap_hook_get_access_checker_ex},
diff --git a/modules/loggers/mod_log_debug.c b/modules/loggers/mod_log_debug.c
index 8a6c1244f5..3f27a958de 100644
--- a/modules/loggers/mod_log_debug.c
+++ b/modules/loggers/mod_log_debug.c
@@ -49,6 +49,7 @@ static const char * const hooks[] = {
"check_authn", /* 9 */
"check_authz", /* 10 */
"insert_filter", /* 11 */
+ "pre_translate_name", /* 12 */
NULL
};
@@ -109,6 +110,12 @@ static int log_debug_handler(request_rec *r)
return DECLINED;
}
+static int log_debug_pre_translate_name(request_rec *r)
+{
+ do_debug_log(r, hooks[12]);
+ return DECLINED;
+}
+
static int log_debug_translate_name(request_rec *r)
{
do_debug_log(r, hooks[3]);
@@ -263,6 +270,7 @@ static void register_hooks(apr_pool_t *p)
ap_hook_log_transaction(log_debug_log_transaction, NULL, NULL, APR_HOOK_FIRST);
ap_hook_quick_handler(log_debug_quick_handler, NULL, NULL, APR_HOOK_FIRST);
ap_hook_handler(log_debug_handler, NULL, NULL, APR_HOOK_FIRST);
+ ap_hook_pre_translate_name(log_debug_pre_translate_name, NULL, NULL, APR_HOOK_FIRST);
ap_hook_translate_name(log_debug_translate_name, NULL, NULL, APR_HOOK_FIRST);
ap_hook_map_to_storage(log_debug_map_to_storage, NULL, NULL, APR_HOOK_FIRST);
ap_hook_fixups(log_debug_fixups, NULL, NULL, APR_HOOK_FIRST);
diff --git a/modules/lua/mod_lua.c b/modules/lua/mod_lua.c
index 05f1e449eb..c6790ac9df 100644
--- a/modules/lua/mod_lua.c
+++ b/modules/lua/mod_lua.c
@@ -1205,6 +1205,11 @@ static int lua_check_user_id_harness_last(request_rec *r)
}
*/
+static int lua_pre_trans_name_harness(request_rec *r)
+{
+ return lua_request_rec_hook_harness(r, "pre_translate_name", APR_HOOK_MIDDLE);
+}
+
static int lua_translate_name_harness_first(request_rec *r)
{
return lua_request_rec_hook_harness(r, "translate_name", AP_LUA_HOOK_FIRST);
@@ -1277,6 +1282,21 @@ static int lua_quick_harness(request_rec *r, int lookup)
return lua_request_rec_hook_harness(r, "quick", APR_HOOK_MIDDLE);
}
+static const char *register_pre_trans_name_hook(cmd_parms *cmd, void *_cfg,
+ const char *file,
+ const char *function)
+{
+ return register_named_file_function_hook("pre_translate_name", cmd, _cfg, file,
+ function, APR_HOOK_MIDDLE);
+}
+
+static const char *register_pre_trans_name_block(cmd_parms *cmd, void *_cfg,
+ const char *line)
+{
+ return register_named_block_function_hook("pre_translate_name", cmd, _cfg,
+ line);
+}
+
static const char *register_translate_name_hook(cmd_parms *cmd, void *_cfg,
const char *file,
const char *function,
@@ -1848,6 +1868,14 @@ command_rec lua_commands[] = {
AP_INIT_TAKE3("LuaAuthzProvider", register_authz_provider, NULL, RSRC_CONF|EXEC_ON_READ,
"Provide an authorization provider"),
+ AP_INIT_TAKE2("LuaHookPreTranslateName", register_pre_trans_name_hook, NULL,
+ OR_ALL,
+ "Provide a hook for the pre_translate name phase of request processing"),
+
+ AP_INIT_RAW_ARGS("