ngx_event_pipe_s
typedef struct ngx_event_pipe_s ngx_event_pipe_t;
// 處理接收自上游的包體的回調函數原型
typedef ngx_int_t (*ngx_event_pipe_input_filter_pt)(ngx_event_pipe_t *p,
ngx_buf_t *buf);
// 向下遊發送響應的回調函數原型
typedef ngx_int_t (*ngx_event_pipe_output_filter_pt)(void *data,
ngx_chain_t *chain);
struct ngx_event_pipe_s {
// Nginx與上游服務器之間的連接
ngx_connection_t *upstream;
// Nginx與下游客戶端之間的連接
ngx_connection_t *downstream;
/* 直接接收自上游服務器的緩衝區鏈表,保存的是未經任何處理的數據。這個鏈表是逆序的,後接受的響應插在鏈表頭處 */
ngx_chain_t *free_raw_bufs;
// 表示接收到的上游響應緩衝區,其數據是經過input_filter處理的
ngx_chain_t *in;
// 指向剛收到的一個緩衝區
ngx_chain_t **last_in;
// 保存着將要發給客戶端的緩衝區鏈表。在寫入臨時文件成功時,會把in中的緩衝區添加到out中
ngx_chain_t *out;
// 等待釋放的緩衝區
ngx_chain_t *free;
// 表示上次調用ngx_http_output_filter函數發送響應時沒有發送完的緩衝區鏈表
ngx_chain_t *busy;
/*
* the input filter i.e. that moves HTTP/1.1 chunks
* from the raw bufs to an incoming chain
*/
// 處理接收到的、來自上游服務器的數據
ngx_event_pipe_input_filter_pt input_filter;
// 用於input_filter的的參數,一般是ngx_http_request_t的地址
void *input_ctx;
// 向下遊發送響應的函數
ngx_event_pipe_output_filter_pt output_filter;
// output_filter的參數,指向ngx_http_request_t
void *output_ctx;
// 1:表示當前已讀取到上游的響應
unsigned read:1;
// 1:啓用文件緩存
unsigned cacheable:1;
// 1:表示接收上游響應時,一次只能接收一個ngx_buf_t緩衝區
unsigned single_buf:1;
// 1:一旦不再接收上游包體,將儘可能地釋放緩衝區
unsigned free_bufs:1;
// 1:表示Nginx與上游交互已經結束
unsigned upstream_done:1;
// 1:Nginx與上游服務器的連接出現錯誤
unsigned upstream_error:1;
// 1:表示與上游服務器的連接已關閉
unsigned upstream_eof:1;
/* 1:表示暫時阻塞讀取上游響應的的流程。此時會先調用ngx_event_pipe_write_to_downstream
函數發送緩衝區中的數據給下游,從而騰出緩衝區空間,再調用ngx_event_pipe_read_upstream
函數讀取上游信息 */
unsigned upstream_blocked:1;
// 1:與下游的交互已結束
unsigned downstream_done:1;
// 1:與下游的連接出現錯誤
unsigned downstream_error:1;
// 1:複用臨時文件。它是由ngx_http_upstream_conf_t中的同名成員賦值的
unsigned cyclic_temp_file:1;
// 已分配的緩衝區數據
ngx_int_t allocated;
// 記錄了接收上游響應的內存緩衝區大小,bufs.size表示每個內存緩衝區大小,bufs.num表示最多可以有num個緩衝區
ngx_bufs_t bufs;
// 用於設置、比較緩衝區鏈表中的ngx_buf_t結構體的tag標誌位
ngx_buf_tag_t tag;
/* busy緩衝區中待發送響應長度的最大值,當到達busy_size時,必須等待busy緩衝區發送了足夠的數據,
才能繼續發送out和in中的內容 */
ssize_t busy_size;
// 已經接收到來自上游響應包體的長度
off_t read_length;
off_t length;
// 表示臨時文件的最大長度
off_t max_temp_file_size;
// 表示一次寫入文件時數據的最大長度
ssize_t temp_file_write_size;
// 讀取上游響應的超時時間
ngx_msec_t read_timeout;
// 向下遊發送響應的超時時間
ngx_msec_t send_timeout;
// 向下遊發送響應時,TCP連接中設置的send_lowat“水位”
ssize_t send_lowat;
// 連接池
ngx_pool_t *pool;
// 日誌
ngx_log_t *log;
// 表示在接收上游服務器響應頭部階段,已經讀取到響應包體
ngx_chain_t *preread_bufs;
// 表示在接收上游服務器響應頭部階段,已經讀取到響應包體長度
size_t preread_size;
// 用於緩存文件
ngx_buf_t *buf_to_file;
size_t limit_rate;
time_t start_sec;
// 存放上游響應的臨時文件
ngx_temp_file_t *temp_file;
// 已使用的ngx_buf_t緩衝區數目
/* STUB */ int num;
};