On this page
将模块从 Apache 1.3 转换为 Apache 2.0
这是尝试写我在将mod_mmap_static
模块转换为 Apache 2.0 时学到的类的第一次尝试。这绝不是确定的,在某些方面甚至可能都不正确,但这只是一个开始。
更轻松的更改...
Cleanup Routines
现在,它们的类型必须为apr_status_t
并返回该类型的值。正常情况下,返回值将为APR_SUCCESS
,除非有必要发出清除错误的 signal。请注意,即使您发出错误 signal,也并非所有代码都会检查错误并采取措施。
Initialisation Routines
现在应将其重命名,以更好地表明它们在整个过程中所处的位置。因此,名称从mmap_init
到mmap_post_config
进行了很小的更改。通过的论点发生了根本变化,现在看起来像
apr_pool_t *p
apr_pool_t *plog
apr_pool_t *ptemp
server_rec *s
Data Types
许多数据类型已移至APR。这意味着某些名称已更改,例如上面显示的名称。以下是您可能需要进行的一些更改的简要列表。
pool
成为apr_pool_t
table
成为apr_table_t
通讯员发生了变化...
Register Hooks
新的体系结构使用一系列钩子来调用您的函数。您需要通过新功能static void register_hooks(void)
将它们添加到模块中。一旦您了解需要完成的功能,该功能实际上就相当简单。在请求处理的某个阶段需要调用的每个函数都需要注册,而处理程序则不需要。可以在多个阶段添加函数,对于每个阶段,您都可以高度控制地指定将调用函数的相对 Sequences。
这是添加到mod_mmap_static
的代码:
static void register_hooks(void)
{
static const char * const aszPre[]={ "http_core.c",NULL };
ap_hook_post_config(mmap_post_config,NULL,NULL,HOOK_MIDDLE);
ap_hook_translate_name(mmap_static_xlat,aszPre,NULL,HOOK_LAST);
};
这注册了两个需要调用的函数,一个在post_config
阶段(实际上每个模块都需要这个),另一个在translate_name
阶段。请注意,尽管函数名称不同,但每个函数的格式是相同的。那是什么格式?
ap_hook_phase_name(function_name, predecessors, successors, position);
定义了 3 个钩子位置...
HOOK_FIRST
HOOK_MIDDLE
HOOK_LAST
要定义位置,请使用该位置,然后使用前任和后继进行修改。每个修饰符都可以是在函数运行之前(前继)或函数运行之后(后继)应调用的函数的列表。
在mod_mmap_static
情况下,我并不关心post_config
阶段,但是mmap_static_xlat
**必须在核心模块完成名称转换之后调用,因此使用 aszPre 定义位置HOOK_LAST
的修饰符。
Module Definition
现在,在创建模块定义时无需担心很多步骤。旧的定义看起来像
module MODULE_VAR_EXPORT module_name_module =
{
STANDARD_MODULE_STUFF,
/* initializer */
/* dir config creater */
/* dir merger --- default is to override */
/* server config */
/* merge server config */
/* command handlers */
/* handlers */
/* filename translation */
/* check_user_id */
/* check auth */
/* check access */
/* type_checker */
/* fixups */
/* logger */
/* header parser */
/* child_init */
/* child_exit */
/* post read-request */
};
新的结构要简单得多。
module MODULE_VAR_EXPORT module_name_module =
{
STANDARD20_MODULE_STUFF,
/* create per-directory config structures */
/* merge per-directory config structures */
/* create per-server config structures */
/* merge per-server config structures */
/* command handlers */
/* handlers */
/* register hooks */
};
其中有些直接读懂,有些则不然。我将尝试总结下面应该做的事情。
直接读取的阶段:
/* dir config creater */
/* create per-directory config structures */
/* server config */
/* create per-server config structures */
/* dir merger */
/* merge per-directory config structures */
/* merge server config */
/* merge per-server config structures */
/* command table */
/* command apr_table_t */
/* handlers */
/* handlers */
其余的旧功能应注册为钩子。到目前为止,定义了以下钩子阶段...
ap_hook_pre_config
- 在处理配置指令之前进行任何所需的设置
ap_hook_check_config
- 查看配置指令的相互依赖性
ap_hook_test_config
- 仅使用
-t
选项执行
- 仅使用
ap_hook_open_logs
- 打开任何指定的日志
ap_hook_post_config
- 这是旧的
_init
例程注册的地方
- 这是旧的
ap_hook_http_method
- 从请求中检索 http 方法。 (Legacy)
ap_hook_auth_checker
- 检查资源是否需要授权
ap_hook_access_checker
- 检查特定于模块的限制
ap_hook_check_user_id
- 检查用户名和密码
ap_hook_default_port
- 检索服务器的默认端口
ap_hook_pre_connection
- 在处理之前但在接受之后进行所需的任何设置
ap_hook_process_connection
- 运行正确的协议
ap_hook_child_init
- 孩子刚开始就打电话
ap_hook_create_request
- ??
ap_hook_fixups
- 在生成内容之前修改内容的最后机会
ap_hook_handler
- 产生内容
ap_hook_header_parser
- 让模块查看大多数模块不使用的 Headers,因为它们为此使用
post_read_request
- 让模块查看大多数模块不使用的 Headers,因为它们为此使用
ap_hook_insert_filter
- 将过滤器插入过滤器链
ap_hook_log_transaction
- 记录有关请求的信息
ap_hook_optional_fn_retrieve
- 检索注册为可选的任何功能
ap_hook_post_read_request
- 在读取请求之后,在任何其他阶段之前调用
ap_hook_quick_handler
- 在任何请求处理之前调用,由缓存模块使用。
ap_hook_translate_name
- 将 URI 转换为文件名
ap_hook_type_checker
- 确定和/或设置文档类型