您的位置:首页 > 运维架构 > Nginx

[linux]Nginx 模块编写 -- echo

2016-09-27 21:44 363 查看
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>

static char* ngx_http_echo(ngx_conf_t *cf, void* post, void* data);

static ngx_conf_post_handler_pt ngx_http_echo_p = ngx_http_echo;

typedef struct{
ngx_str_t msg;
}ngx_http_echo_loc_conf_t;

static void* ngx_http_echo_create_loc_conf(ngx_conf_t *cf)
{
ngx_http_echo_loc_conf_t *conf;
conf = ngx_pcalloc(cf->pool,sizeof(ngx_http_echo_loc_conf_t));
if(conf == NULL){
return NULL;
}
return conf;
}

static ngx_command_t ngx_http_echo_commands[]={
{ngx_string("echo"),
NGX_HTTP_LOC_CONF | NGX_CONF_TAKE1,
ngx_conf_set_str_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_echo_loc_conf_t,msg),
&ngx_http_echo_p},

ngx_null_command
};

static ngx_http_module_t ngx_http_echo_module_ctx={
NULL,
NULL,

NULL,
NULL,

NULL,
NULL,

ngx_http_echo_create_loc_conf,
NULL
};

ngx_module_t ngx_http_echo_module = {
NGX_MODULE_V1,
&ngx_http_echo_module_ctx,
ngx_http_echo_commands,
NGX_HTTP_MODULE,
NULL,NULL,NULL,NULL,
NULL,NULL,NULL,
NGX_MODULE_V1_PADDING
};

static ngx_int_t ngx_http_echo_handler(ngx_http_request_t *r)
{
ngx_int_t rc;
ngx_buf_t *b;
ngx_chain_t out;
ngx_http_echo_loc_conf_t *alcf;

if(!(r->method & (NGX_HTTP_GET | NGX_HTTP_HEAD))){
return NGX_HTTP_NOT_ALLOWED;
}

rc = ngx_http_discard_request_body(r);
if(rc!=NGX_OK){
return rc;
}

r->headers_out.content_type_len = sizeof("text/html") - 1;
r->headers_out.content_type.len = sizeof("text/html") - 1;
r->headers_out.content_type.data = (u_char*)"text/html";

alcf = ngx_http_get_module_loc_conf(r,ngx_http_echo_module);
if(r->method == NGX_HTTP_HEAD){
r->headers_out.status = NGX_HTTP_OK;
r->headers_out.content_length_n = alcf->msg.len;
return ngx_http_send_header(r);
}

b = ngx_pcalloc(r->pool,sizeof(ngx_buf_t));
if(b == NULL){
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}

out.buf = b;
out.next = NULL;

b->pos = alcf->msg.data;
b->last = alcf->msg.data + alcf->msg.len;

b->memory = 1;
b->last_buf = 1;

r->headers_out.status = NGX_OK;
r->headers_out.content_length_n = alcf->msg.len;

rc = ngx_http_send_header(r);

if(rc==NGX_ERROR || rc > NGX_OK || r->header_only){
return rc;
}

return ngx_http_output_filter(r,&out);

}

static char* ngx_http_echo(ngx_conf_t *cf, void* post, void* data)
{
ngx_http_core_loc_conf_t *clcf;
clcf = ngx_http_conf_get_module_loc_conf(cf,ngx_http_core_module);
clcf->handler = ngx_http_echo_handler;

return NGX_CONF_OK;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: