diff options
-rw-r--r-- | docs/manual/developer/modguide.xml | 1 | ||||
-rw-r--r-- | docs/manual/mod/mod_log_debug.xml | 1 | ||||
-rw-r--r-- | docs/manual/mod/mod_lua.xml | 28 | ||||
-rw-r--r-- | modules/examples/mod_example_hooks.c | 17 | ||||
-rw-r--r-- | modules/generators/mod_info.c | 1 | ||||
-rw-r--r-- | modules/loggers/mod_log_debug.c | 8 | ||||
-rw-r--r-- | modules/lua/mod_lua.c | 31 |
7 files changed, 85 insertions, 2 deletions
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: <li><code>ap_hook_child_init</code>: Place a hook that executes when a child process is spawned (commonly used for initializing modules after the server has forked)</li> <li><code>ap_hook_pre_config</code>: Place a hook that executes before any configuration data has been read (very early hook)</li> <li><code>ap_hook_post_config</code>: Place a hook that executes after configuration has been parsed, but before the server has forked</li> +<li><code>ap_hook_pre_translate_name</code>: Place a hook that executes when a URI needs to be translated into a filename on the server, before decoding</li> <li><code>ap_hook_translate_name</code>: Place a hook that executes when a URI needs to be translated into a filename on the server (think <code>mod_rewrite</code>)</li> <li><code>ap_hook_quick_handler</code>: Similar to <code>ap_hook_handler</code>, except it is run before any other request hooks (translation, auth, fixups etc)</li> <li><code>ap_hook_log_transaction</code>: Place a hook that executes when the server is about to add a log entry of the current request</li> 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 @@ <table border="1" style="zebra"> <columnspec><column width="1"/></columnspec> <tr><th>Name</th></tr> + <tr><td><code>pre_translate_name</code></td></tr> <tr><td><code>translate_name</code></td></tr> <tr><td><code>type_checker</code></td></tr> <tr><td><code>quick_handler</code></td></tr> 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 @@ -216,6 +216,13 @@ performing access control, or setting mime types:</p> been mapped to a host or virtual host</td> </tr> <tr> + <td>Pre-Translate name</td> + <td><directive module="mod_lua">LuaHookPreTranslateName</directive></td> + <td>This phase translates the requested URI into a filename on the + system, before decoding occurs. Modules such as <module>mod_proxy</module> + can operate in this phase.</td> + </tr> + <tr> <td>Translate name</td> <td><directive module="mod_lua">LuaHookTranslateName</directive></td> <td>This phase translates the requested URI into a filename on the @@ -439,7 +446,7 @@ end <td>string</td> <td>yes</td> <td>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.</td> </tr> <tr> @@ -538,7 +545,7 @@ end <td>string</td> <td>yes</td> <td>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.</td> + the post_read_request/pre_translate_name/translate_name phase of a request.</td> </tr> <tr> <td><code>range</code></td> @@ -1517,6 +1524,23 @@ end </directivesynopsis> <directivesynopsis> +<name>LuaHookPreTranslate</name> +<description>Provide a hook for the pre_translate phase of a request +processing</description> +<syntax>LuaHookPreTranslate /path/to/lua/script.lua hook_function_name</syntax> +<contextlist><context>server config</context><context>virtual host</context> +<context>directory</context><context>.htaccess</context> +</contextlist> +<override>All</override> +<usage> +<p> + Just like LuaHookTranslateName, but executed at the pre_translate phase, + where the URI-path is not percent decoded. +</p> +</usage> +</directivesynopsis> + +<directivesynopsis> <name>LuaHookFixups</name> <description>Provide a hook for the fixups phase of a request processing</description> 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 @@ -1176,6 +1176,22 @@ static int x_post_read_request(request_rec *r) /* * 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 * rules (Alias directives and the like) will continue to be followed. * @@ -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("<LuaHookPreTranslateName", register_pre_trans_name_block, NULL, + EXEC_ON_READ | OR_ALL, + "Provide a hook for the pre_translate name phase of request processing"), + AP_INIT_TAKE23("LuaHookTranslateName", register_translate_name_hook, NULL, OR_ALL, "Provide a hook for the translate name phase of request processing"), @@ -2101,6 +2129,9 @@ static void lua_register_hooks(apr_pool_t *p) APR_HOOK_MIDDLE); /* http_request.h hooks */ + ap_hook_pre_translate_name(lua_pre_trans_name_harness, NULL, NULL, + APR_HOOK_MIDDLE); + ap_hook_translate_name(lua_translate_name_harness_first, NULL, NULL, AP_LUA_HOOK_FIRST); ap_hook_translate_name(lua_translate_name_harness, NULL, NULL, |