1.ngx_http_request_body_t
// 《深入理解Nginx模块开发与架构解析(V2) 11.8.1》
//https://github.com/chronolaw/annotated_nginx/blob/master/nginx/src/http/ngx_http_request.h
// 求体的数据结构,用于读取或丢弃请求体数据
typedef struct {
ngx_temp_file_t *temp_file; // 存放http包体的临时文件
/*接收HTTP包体的缓冲区链表。当包体需要全部存放在内存中时,如果一块ngx_buf_t
缓冲区无法存放完,这时就需要使用ngx_chain_t链表来存放*/
ngx_chain_t *bufs;
/* 直接接收HTTP包体的缓存 */
ngx_buf_t *buf;
/*根据content-length头部和已接收到的包体长度,计算出的还需要接收的包体长度,
剩余要读取的字节数,对于确定长度(有content length)的就是
r->headers_in.content_length_n,在读取过程中会不断变化,最终为0*/
off_t rest;
off_t received;
/* 空闲节点链表,优化用,避免再向内存池要节点 */
ngx_chain_t *free;
ngx_chain_t *busy;
/* 读取chunk数据的结构体,用于ngx_http_parse_chunked() */
ngx_http_chunked_t *chunked;
/* 当读取完毕后的回调函数,即ngx_http_read_client_request_body的第二个参数*/
ngx_http_client_body_handler_pt post_handler;
unsigned filter_need_buffering:1;
unsigned last_sent:1;
unsigned last_saved:1;
} ngx_http_request_body_t;
// https://github.com/chronolaw/annotated_nginx/blob/master/nginx/src/core/ngx_buf.h
// 表示一个单块的缓冲区,既可以是内存也可以是文件
// start和end两个成员变量标记了数据所在内存块的边界
// 如果内存块是可以修改的,在操作时必须参考这两个成员防止越界
struct ngx_buf_s {
u_char *pos; //内存数据的起始位置
u_char *last; //内存数据的结束位置
off_t file_pos; //文件数据的起始偏移量
off_t file_last; //文件数据的结束偏移量
u_char *start; /* start of buffer */ //内存数据的上界
u_char *end; /* end of buffer */ //内存数据的下界
ngx_buf_tag_t tag; //void*指针,可以是任意数据
ngx_file_t *file; //存储数据的文件对象
ngx_buf_t *shadow;
/* the buf's content could be changed */
unsigned temporary:1; //内存块临时数据,可以修改
/*
* the buf's content is in a memory cache or in a read only memory
* and must not be changed
*/
unsigned memory:1; //内存块数据,不允许修改
/* the buf's content is mmap()ed and must not be changed */
unsigned mmap:1; //内存映射数据,不允许修改
unsigned recycled:1;
unsigned in_file:1; //缓冲区在文件里
unsigned flush:1; //要求Nginx立即输出本缓冲区
unsigned sync:1; //要求Nginx同步操作本缓冲区
unsigned last_buf:1; //最后一块缓冲区
unsigned last_in_chain:1; //链里的最后一块缓冲区
unsigned last_shadow:1;
unsigned temp_file:1; //缓冲区在临时文件里
/* STUB */ int num;
};