深入解读Nginx 0.1.0版本的HTTP模块初始化源代码(第五部分)
最编程
2024-02-11 21:22:52
...
继续http模块的分析,这次分析的是init_module钩子函数的执行。http模块各子模块的init_module钩子主要做的事情是两个,一个就是注册phases回调,一个就是挂载模块到filter链表。首先看一下注册phases回调的模块 access模块
static ngx_int_t ngx_http_access_init(ngx_cycle_t *cycle)
{
ngx_http_handler_pt *h;
ngx_http_core_main_conf_t *cmcf;
// 取出http_core_module的配置结构体
cmcf = ngx_http_cycle_get_module_main_conf(cycle, ngx_http_core_module);
// 设置在NGX_HTTP_ACCESS_PHASE阶段的回调
h = ngx_push_array(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
if (h == NULL) {
return NGX_ERROR;
}
*h = ngx_http_access_handler;
return NGX_OK;
}
charset模块
static ngx_int_t ngx_http_charset_filter_init(ngx_cycle_t *cycle)
{
ngx_http_next_header_filter = ngx_http_top_header_filter;
ngx_http_top_header_filter = ngx_http_charset_header_filter;
ngx_http_next_body_filter = ngx_http_top_body_filter;
ngx_http_top_body_filter = ngx_http_charset_body_filter;
return NGX_OK;
}
ngx_http_top_header_filter变量是定义在ngx_http.c文件的一个全局变量。ngx_http_next_header_filter变量是每个filter模块自己定义的一个模块内可见的局部变量。ngx_http_top_body_filter类似。每个模块先令自己的next变量执行当前top变量指向的节点,然后再令top节点指向本模块的filter函数。从而实现了一条filter链表。当执行到当前模块的filter钩子后,钩子函数最后会执行next对应的下一个钩子。
上一篇: 一分钟知识点:钩子函数
下一篇: 在Java中实现钩子函数的简易理解与应用