nginx过滤请求php,Nginx HTTP过滤模块开发

#include#include#include//Declarestatic ngx_int_t ngx_http_myfilter_header_filter(ngx_http_request_t *);

static ngx_int_t ngx_http_myfilter_body_filter(ngx_http_request_t*,ngx_chain_t*);

static ngx_http_output_header_filter_pt ngx_http_next_header_filter;

static ngx_http_output_body_filter_pt ngx_http_next_body_filter;

//On/Offtypedefstruct {

ngx_flag_t enable;

}ngx_http_myfilter_conf_t;

staticvoid *ngx_http_myfilter_create_conf(ngx_conf_t *cf){

ngx_http_myfilter_conf_t *mycf;

//Allocate memory

mycf = (ngx_http_myfilter_conf_t*)ngx_pcalloc(cf->pool,sizeof(ngx_http_myfilter_conf_t));

if(mycf == NULL)

returnNULL;

mycf->enable = NGX_CONF_UNSET;

return mycf;

}

staticchar *

ngx_http_myfilter_merge_conf(ngx_conf_t *cf,void *parent,void *child){

ngx_http_myfilter_conf_t *prev = (ngx_http_myfilter_conf_t*)parent;

ngx_http_myfilter_conf_t *conf = (ngx_http_myfilter_conf_t*)child;

ngx_conf_merge_value(conf->enable,prev->enable,0);

return NGX_CONF_OK;

}

/* ------------------------------------------- *///State for prefixtypedefstruct {

/* add_prefix =

* 0 the filter module is off

* 1 can add prefix

* 2 has been added prefix already

*/

ngx_int_t add_prefix;

} ngx_http_myfilter_ctx_t;

//Analyse configurestatic ngx_command_t

ngx_http_myfilter_commands[]={

{ngx_string("add_prefix"),

NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_FLAG,

ngx_conf_set_flag_slot,

NGX_HTTP_LOC_CONF_OFFSET,

offsetof(ngx_http_myfilter_conf_t,enable),

NULL},

ngx_null_command

};

static ngx_int_t

ngx_http_myfilter_init(ngx_conf_t *cf){

//Insert before the first node

ngx_http_next_header_filter = ngx_http_top_header_filter;

ngx_http_top_header_filter = ngx_http_myfilter_header_filter;

ngx_http_next_body_filter = ngx_http_top_body_filter;

ngx_http_top_body_filter = ngx_http_myfilter_body_filter;

return NGX_OK;

}

/* ------------------------------------------- *///Parsestatic ngx_http_module_t

ngx_http_myfilter_module_ctx = {

NULL,

ngx_http_myfilter_init,

NULL,

NULL,

NULL,

NULL,

ngx_http_myfilter_create_conf,

ngx_http_myfilter_merge_conf

};

/* ------------------------------------------- *///Module information

ngx_module_t ngx_http_myfilter_module = {

NGX_MODULE_V1,

&ngx_http_myfilter_module_ctx,

ngx_http_myfilter_commands,

NGX_HTTP_MODULE,

NULL,

NULL,

NULL,

NULL,

NULL,

NULL,

NULL,

NGX_MODULE_V1_PADDING

};

/* ------------------------------------------- */static ngx_str_t filter_prefix = ngx_string("[my filter module]");

//Filter to process the headerstatic ngx_int_t

ngx_http_myfilter_header_filter(ngx_http_request_t *r){

ngx_http_myfilter_ctx_t *ctx;

ngx_http_myfilter_conf_t *conf;

if(r->headers_out.status != NGX_HTTP_OK){

return ngx_http_next_header_filter(r);

}

//Get context

ctx = ngx_http_get_module_ctx(r,ngx_http_myfilter_module);

if(ctx){

return ngx_http_next_header_filter(r);

}

//Get configure by ngx_http_myfilter_conf_t

conf = ngx_http_get_module_loc_conf(r,ngx_http_myfilter_module);

if(conf->enable == 0){//add_prefix offreturn ngx_http_next_header_filter(r);

}

//Create ngx_http_myfilter_ctx_t

ctx = ngx_pcalloc(r->pool,sizeof(ngx_http_myfilter_ctx_t));

if(ctx == NULL){

return NGX_ERROR;

}

//add_prefix = 0 express do not add prefix

ctx->add_prefix = 0;

//Set context

ngx_http_set_ctx(r,ctx,ngx_http_myfilter_module);

//myfilter module only figure out Content-Type="text/plain"if(r->headers_out.content_type.len>=sizeof("text/plain") - 1 &&

ngx_strncasecmp(r->headers_out.content_type.data,(u_char*)"text/plain",sizeof("text/plain")-1)==0){

//Set add_prefix

ctx->add_prefix = 1;

if(r->headers_out.content_length_n>0)

r->headers_out.content_length_n += filter_prefix.len;

}

return ngx_http_next_header_filter(r);

}

//Filter to process the bodystatic ngx_int_t

ngx_http_myfilter_body_filter(ngx_http_request_t *r,ngx_chain_t *in){

ngx_http_myfilter_ctx_t *ctx;

ctx = ngx_http_get_module_ctx(r,ngx_http_myfilter_module);

//If cannot get context or the add_prefix is 0/2,do not processif(ctx == NULL || ctx->add_prefix !=1)

return ngx_http_next_body_filter(r,in);

//To make sure never add prefix again

ctx->add_prefix = 2;

//Get prefix string

ngx_buf_t *b = ngx_create_temp_buf(r->pool,filter_prefix.len);

b->start = b->pos = filter_prefix.data;

b->last = b->pos + filter_prefix.len;

//Get and set ngx_chain_t list at the bginning

ngx_chain_t *cl = ngx_alloc_chain_link(r->pool);

cl->buf = b;

cl->next = in;

return ngx_http_next_body_filter(r,cl);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值