在之前的工作中,我使用ngx_http_send_header和ngx_http_output_filter响应客户端。但是在实际的测试中遇到很多问题,例如ngx_http_output_filter在某些时候常常返回NGX_ERROR或是NGX_AGAIN。所以我不得不深入这个函数,找出其中的原因。
一哥们的博文《ngx的filter处理》(http://simohayha.iteye.com/blog/642314)介绍了filter的工作原理。
但还不能用于解决我的问题。这篇文章中说, ngx_http_write_filter_module和ngx_http_header_filter_module
分别是body filter和header filter的第一个初始化模块。这个模块完成了发送数据的主要任务。
在文件ngx_http_write_filter_module.c中,有函数ngx_http_write_filter。
ngx_http_write_filter(ngx_http_request *r, ngx_chain_t *in ) {
……
chain->send_chain(c,c->out,limit);//这句代码完成了发送数据的任务
…….
}
而这个回调函数在哪里呢?
#if (NGX_HAVE_SENDFILE)
ngx_linux_sendfile_chain,
NGX_IO_SENDFILE
#else
ngx_writev_chain,
0
#endif
由上边的代码可知,如果启用了sendfile, chain->send_chain与前者对应,否则就是后者。
在我的开发环境中似乎是在文件ngx_linux_sendfile_chain.c中的函数:
ngx_linux_sendfile_chain(ngx_connection_t *c, ngx_chain_t *in, off_t *limit) {
。。。。
}
///////////////////////////////////////////代码读到这里,我顿悟了////////////////////////////////////////////////////////////////////////////
为什么非得使用nginx自己定义的函数呢?为什么一定要了解那些复杂的层层嵌套呢?为什么
不直接利用socket发送需要传输的内容呢?源代码,去屎吧!我再也不管代码结构是否美观了,
只要功能出来即可!
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
虽说要抛开nginx自带的HTTP响应函数,但是,我还是要了解结构ngx_http_request_t *r中一些字段的
含义。这样才可以提取出自己需要的信息。
r->headers_out保存了关于一些关于服务器回复客户端的HTTP头的信息。下面,我们来关注一下
ngx_http_headers_out_t这个结构。
在ngx_http_request.h这个文件中,定义了此结构
typedef struct {
……
ngx_uint_t status;//此处保存了回复客户端的状态码,直接使用即可
ngx_table_elt_t *server;//此处保存了
ngx_table_elt_t *date;//
}
其中ngx_table_elt_t的定义如下:
typedef struct {
ngx_uint_t hash;
ngx_str_t key;
ngx_str_t value;
u_cahr *lowcase_key;
}
其中ngx_str_t的定义如下:
typedef struct {
size_t len;
u_char *data;
} ngx_str_t
/////////////////////////////////////不对,我需要的信息不在此结构中///////////////////////////////////////////////////////////
ngx_http_headers_out_t这个结构的内容应当在filter中被填充,而目前,我添加代码
的地方还没有进行到这一步,看来我将不得不研究一下此过程中涉及到的所有filter。
只好放弃先前思路,正是:几行代码无我份,一场辛苦为谁忙。