-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
ShiPin
committed
Feb 9, 2022
1 parent
776d975
commit 02dd2e4
Showing
3 changed files
with
137 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
ngx_addon_name=ngx_http_hello_module2 | ||
HTTP_MODULES="$HTTP_MODULES ngx_http_hello_module2" | ||
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_module2.c" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
#include <ngx_config.h> | ||
#include <ngx_core.h> | ||
#include <ngx_http.h> | ||
|
||
static ngx_int_t ngx_http_hello_handler2(ngx_http_request_t *r); | ||
|
||
static char * | ||
ngx_http_hello2(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); | ||
|
||
static ngx_int_t ngx_http_hello_init(ngx_conf_t *cf); | ||
static ngx_int_t ngx_http_hello_log_handler(ngx_http_request_t *r); | ||
|
||
/** | ||
* 处理nginx.conf中的配置命令解析 | ||
* 例如: | ||
* location /hello { | ||
* hello | ||
* } | ||
* 当用户请求:http://127.0.0.1/hello的时候,请求会跳转到hello这个配置上 | ||
* hello的命令行解析回调函数:ngx_http_hello | ||
*/ | ||
static ngx_command_t ngx_http_hello_commands2[] = { { | ||
ngx_string("hello2"), | ||
NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LMT_CONF | ||
| NGX_CONF_NOARGS, ngx_http_hello2, | ||
NGX_HTTP_LOC_CONF_OFFSET, 0, NULL }, | ||
ngx_null_command }; | ||
|
||
/** | ||
* 模块上下文 | ||
*/ | ||
static ngx_http_module_t ngx_http_hello_module_ctx2 = { NULL, ngx_http_hello_init, NULL, NULL, | ||
NULL, NULL, NULL, NULL }; | ||
|
||
/** | ||
* 模块的定义 | ||
*/ | ||
ngx_module_t ngx_http_hello_module2 = { | ||
NGX_MODULE_V1, &ngx_http_hello_module_ctx2, ngx_http_hello_commands2, | ||
NGX_HTTP_MODULE, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
NGX_MODULE_V1_PADDING }; | ||
|
||
/** | ||
* 命令解析的回调函数 | ||
* 该函数中,主要获取loc的配置,并且设置location中的回调函数handler | ||
*/ | ||
static char * | ||
ngx_http_hello2(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { | ||
ngx_http_core_loc_conf_t *clcf; | ||
|
||
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); | ||
/* 设置回调函数。当请求http://127.0.0.1/hello的时候,会调用此回调函数 */ | ||
clcf->handler = ngx_http_hello_handler2; | ||
|
||
return NGX_CONF_OK; | ||
} | ||
|
||
/** | ||
* 模块回调函数,输出hello world | ||
*/ | ||
static ngx_int_t ngx_http_hello_handler2(ngx_http_request_t *r) { | ||
if (!(r->method & (NGX_HTTP_GET | NGX_HTTP_HEAD))) { | ||
return NGX_HTTP_NOT_ALLOWED; | ||
} | ||
|
||
ngx_int_t rc = ngx_http_discard_request_body(r); | ||
if (rc != NGX_OK) { | ||
return rc; | ||
} | ||
|
||
ngx_str_t type = ngx_string("text/plain"); | ||
ngx_str_t response = ngx_string("Hello World2"); | ||
r->headers_out.status = NGX_HTTP_OK; | ||
r->headers_out.content_length_n = response.len; | ||
r->headers_out.content_type = type; | ||
|
||
rc = ngx_http_send_header(r); | ||
if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) { | ||
return rc; | ||
} | ||
|
||
ngx_buf_t *b; | ||
b = ngx_create_temp_buf(r->pool, response.len); | ||
if (b == NULL) { | ||
return NGX_HTTP_INTERNAL_SERVER_ERROR; | ||
} | ||
|
||
ngx_memcpy(b->pos, response.data, response.len); | ||
b->last = b->pos + response.len; | ||
b->last_buf = 1; | ||
|
||
ngx_chain_t out; | ||
out.buf = b; | ||
out.next = NULL; | ||
|
||
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | ||
"hello world "); | ||
|
||
return ngx_http_output_filter(r, &out); | ||
} | ||
|
||
/** | ||
* 初始化 | ||
* 将ngx_http_hello_log_handler挂载到NGX_HTTP_LOG_PHASE日志处理阶段 | ||
*/ | ||
static ngx_int_t ngx_http_hello_init(ngx_conf_t *cf) { | ||
ngx_http_handler_pt *h; | ||
ngx_http_core_main_conf_t *cmcf; | ||
|
||
cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); | ||
|
||
h = ngx_array_push(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers); | ||
if (h == NULL) { | ||
return NGX_ERROR; | ||
} | ||
|
||
*h = ngx_http_hello_log_handler; | ||
|
||
return NGX_OK; | ||
} | ||
|
||
/** | ||
* NGX_HTTP_LOG_PHASE日志处理阶段的回调函数å | ||
*/ | ||
static ngx_int_t ngx_http_hello_log_handler(ngx_http_request_t *r) { | ||
|
||
/* 仅仅在日志处理阶段,新增加一行日志 */ | ||
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | ||
"hello2 ==================================> "); | ||
|
||
return NGX_DECLINED; | ||
} |