nginx的接受包体

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;
};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值