欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

深入解读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对应的下一个钩子。