chunpu / blog

personal blog render by jekyll
MIT License
51 stars 8 forks source link

Nginx模块开发之set函数 #25

Open chunpu opened 9 years ago

chunpu commented 9 years ago

set函数就是上一篇提到的很重要的函数之一, 是command命令结构体中的第三个参数.在读取命令时候触发的回调函数.

set是一个函数指针, 原型是这样的.

char * (*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

返回值

char *, 返回值可以是NGX_CONF_OK, 或者NGX_CONF_ERROR. 也就是0或者-1的指针.

参数

ngx_conf_t *cf含义未知

ngx_command_t *cmd 表示自己所在的那个command结构体

void *conf 当然是空

如何在set函数中挂上handler

ngx_http_core_loc_conf_t *corecf;
corecf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
corecf->handler = handler;

corecf为何物?, 其实就是读到test命令时的配置状态, corecf是一个巨大的结构体, name属性是"/test", 也就是我们定义的那个路径.后面还有regex等属性, 应该也是用来匹配路径的.

应该可以猜测, 给corecf的handler属性赋值后, 如果请求的路径匹配corecf的name或者正则等, 就会触发我们挂载的handler函数.

挂完后返回NGX_CONF_OK即可.

源代码中如何调用set函数

set在ngx_conf_handler.c文件在ngx_int_t ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last)函数中被调用.

显然set函数的第一个参数cf就是这个大函数中的第一个参数.

第二个参数cmd, 是每一个模块的cmd, 在gdb中print每个模块的cmd, 可以发现daemon, error_log都是command.

ngx_conf_handler函数的作用就是遍历所有模块, 然后带着cf和cmd参数触发cmd的set函数,仅此而已.