apache / 2.4 / reference / developer-modules.html

将模块从 Apache 1.3 转换为 Apache 2.0

这是尝试写我在将mod_mmap_static模块转换为 Apache 2.0 时学到的类的第一次尝试。这绝不是确定的,在某些方面甚至可能都不正确,但这只是一个开始。

更轻松的更改...

Cleanup Routines

现在,它们的类型必须为apr_status_t并返回该类型的值。正常情况下,返回值将为APR_SUCCESS,除非有必要发出清除错误的 signal。请注意,即使您发出错误 signal,也并非所有代码都会检查错误并采取措施。

Initialisation Routines

现在应将其重命名,以更好地表明它们在整个过程中所处的位置。因此,名称从mmap_initmmap_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
  • 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

    • 确定和/或设置文档类型