[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; }
相关文章推荐
- Nginx平滑升级
- Nginx在Linux中的命令行
- linux 中php以及nginx的重启命令
- Nginx初识
- FFmpeg常用推流命令
- nginx详细解读location rewrite和proxy_pass
- Nginx深入详解之upstream分配方式
- Nginx学习笔记
- linux centos 6.4 安装nginx
- 高并发下的 Nginx 优化
- nginx proxy_redirect指令功能
- nginx 安装
- nginx相关配置说明
- nginx upstream
- ubuntu下发布asp.net core并用nginx代理之旅
- Nginx的基本配置与优化
- nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器
- 阿里云centos配置nginx和nodejs
- nginx和lnmp架构
- nginx总结