API:http://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/zlib-deflateinit2.html
ngx_http_gzip_header_filter
1.首先配置信息的驗證,是否需要進行gzip壓縮
2.給每個請求設置ctx
3.ctx同時反向關聯request
4.ngx_http_gzip_filter_memory 設置wbits,memlevel參數 gzip庫調用需要,設置需要分配的內存大小 allocated
5.增加gzip頭
6.刪除了content_length_n 因為不知道後續的壓縮大小為多少.
ngx_http_gzip_body_filter
1.獲取header設置的ctx ngx_http_gzip_filter_buffer 復制到新的緩沖 ctx的.
2.調用 ngx_http_gzip_filter_deflate_start,給preallocated 分配空間大小ctx->allocated=header計算的值.
ctx->free_mem = preallocated ;zstream 設置屬性值; 估計是給gzip 設置空間,zstream設置內存對象,內存分配和回收函數
3.調用ngx_chain_add_copy;in的buf導入ctx->in
4.ngx_http_gzip_filter_add_data;ctx->in_buf = ctx->in;ctx->in=ctx->in->next;設置zstream.next_in,zstream_avail_in 通過ctx->in_buf;判斷是否為最後一個buf,如果是 ctx->flush;
5.ngx_http_gzip_filter_get_buf;創建臨時buf size=conf->bufs.size 設置ctx->zstream.nextout的大小.開始位置到結束位置
6.ngx_http_gzip_filter_deflate ;deflate();
7.ngx_http_gzip_filter_add_data;
8. ngx_http_next_body_filter(r, ctx->out);重新定向了輸出流.沒有用filter中傳入的in