文章17 ngx_http_request_t結構體詳解
struct ngx_http_request_s {
uint32_t signature; /* "HTTP" */
/*
與連線有關的內容
*/
ngx_connection_t * connection;
/*
以下四個儲存的是模組所對應的上下文結構體的指標。
其中ctx對應於自定義的上下文結構體指標
main_conf對應於main的上下文結構體指標
loc_conf對應於loc的上下文結構體指標
src_conf對應於srv的上下文結構體指標
*/
void ** ctx;
void ** main_conf;
void ** srv_conf;
void ** loc_conf;
/*讀寫事件的函式指標*/
ngx_http_event_handler_pt read_event_handler;
ngx_http_event_handler_pt write_event_handler;
#if (NGX_HTTP_CACHE)
ngx_http_cache_t * cache;
#endif
/*
與upstream模組相關的結構體
*/
ngx_http_upstream_t * upstream;/*用於upstream模組*/
ngx_array_t * upstream_states;/*與upstream模組相關*/
/* of ngx_http_upstream_state_t */
ngx_pool_t * pool;/*記憶體池*/
ngx_buf_t * header_in;// 會儲存一些訊息體的內容
ngx_http_headers_in_t headers_in;//代表請求頭部 // 請求的header結構體
ngx_http_headers_out_t headers_out;//代表響應頭部
ngx_http_request_body_t * request_body;//代表請求頭部.r-> request_body-> bufs中存放的請求體中的資料
time_t lingering_time; /*unkown*/
time_t start_sec;/*unkown*/
ngx_msec_t start_msec; /*unkown*/
/*
從method到http_protocol都是請求行中資訊
*/
ngx_uint_t method;
ngx_uint_t http_version;//http版本
ngx_str_t request_line;//請求行
ngx_str_t uri;
ngx_str_t args;
ngx_str_t exten;
ngx_str_t unparsed_uri;
ngx_str_t method_name;
ngx_str_t http_protocol;
ngx_chain_t * out; /*unkown*//*這裡要注意ngx_http_request_t中有一個out的chain,這個chain儲存的是上一次還沒有被髮完的buf,這樣每次我們接收到新的chain的話,就需要將新的chain連線到老的out chain上,然後再發出去*/
/*接下來從main到posted_requests都是與主請求和子請求有關的內容/
ngx_http_request_t * main;//這個表示主的request,也就是當前的request鏈中最上面的那個request,通過這個域我們就能判斷當前的request是不是subrequest。
ngx_http_request_t * parent;//這個表示當前的request的父request。
//subrequest就是子請求,也就是在當前的一個請求中nginx再生成一個請求。
ngx_http_postponed_request_t * postponed;//先來看postponed,這個域用來快取父request的資料(也就是將要傳送資料的request)
ngx_http_post_subrequest_t * post_subrequest;//這個域儲存了子請求的post request,它也就是儲存了需要被髮送的request.
ngx_http_posted_request_t * posted_requests;//這個儲存了所有的需要處理的request連結串列,也就是說它即包含子請求也包含父請求
/* virtual hosts based on the address:port
r->virtual_names = addr_conf->virtual_names
*/
ngx_http_virtual_names_t * virtual_names;
ngx_int_t phase_handler; /*應該是在請求處理的多個階段中,利用phase_handler依次執行多個階段*/
ngx_http_handler_pt content_handler; /*生成內容的處理函式 比如ngx_http_proxy_handler等*/
ngx_uint_t access_code;/*unkown*/
ngx_http_variable_value_t * variables;//variables 包含了所有的變數
#if (NGX_PCRE)
ngx_uint_t ncaptures;
int * captures;
u_char * captures_data;
#endif
size_t limit_rate;/*unkown*/
/*
r->limit_rate,這個表示當前的request的傳送限制速率,這個也是在nginx.conf中配置的,而一般就是通過這個值來設定c->write->delayed的。也就是說如果傳送速率大於這個limit了的話,就設定delayed,然後這邊的request就會延遲傳送
*/
/* used to learn the Apache compatible response length without a header */
size_t header_size;/*unkown*/
off_t request_length;/*unkown*/
ngx_uint_t err_status;/*unkown*/
ngx_http_connection_t * http_connection;/*unkown*/
ngx_http_log_handler_pt log_handler; /*unkown*/
ngx_http_cleanup_t * cleanup;
unsigned subrequests:8;
unsigned count:8;
unsigned blocked:8;
unsigned aio:1;
unsigned http_state:4;
/* URI with "/." and on Win32 with "//" */
unsigned complex_uri:1;
/* URI with "%" */
unsigned quoted_uri:1;
/* URI with "+" */
unsigned plus_in_uri:1;
/* URI with " " */
unsigned space_in_uri:1;
unsigned invalid_header:1;// 一個標示位,標示header是否有效,不正常的結束視為無效
unsigned add_uri_to_alias:1;
unsigned valid_location:1;
unsigned valid_unparsed_uri:1;
unsigned uri_changed:1;
unsigned uri_changes:4;
/*
下面這兩個引數就會設定為每個body都存放到臨時檔案裡,並且這個臨時檔案在請求結束後不會被刪除:
r->request_body_in_persistent_file = 1;
r->request_body_in_file_only = 1;
*/
unsigned request_body_in_single_buf:1;
unsigned request_body_in_file_only:1;
unsigned request_body_in_persistent_file:1;
unsigned request_body_in_clean_file:1;
unsigned request_body_file_group_access:1;
unsigned request_body_file_log_level:3;
unsigned subrequest_in_memory:1;
unsigned waited:1;
#if (NGX_HTTP_CACHE)
unsigned cached:1;
#endif
#if (NGX_HTTP_GZIP)
unsigned gzip_tested:1;
unsigned gzip_ok:1;
unsigned gzip_vary:1;
#endif
unsigned proxy:1;
unsigned bypass_cache:1;
unsigned no_cache:1;
/*
* instead of using the request context data in
* ngx_http_limit_conn_module and ngx_http_limit_req_module
* we use the single bits in the request structure
*/
unsigned limit_conn_set:1;
unsigned limit_req_set:1;
#if 0
unsigned cacheable:1;
#endif
unsigned pipeline:1;
unsigned plain_http:1;
unsigned chunked:1;
unsigned header_only:1; /*當請求方法為HEAD時,r->header_only=1 ,在ngx_http_header_filter函式中*/
unsigned keepalive:1;
unsigned lingering_close:1;
unsigned discard_body:1;
unsigned internal:1;
unsigned error_page:1;
unsigned ignore_content_encoding:1;
unsigned filter_finalize:1;
unsigned post_action:1;
unsigned request_complete:1;
unsigned request_output:1;
unsigned header_sent:1;
unsigned expect_tested:1;
unsigned root_tested:1;
unsigned done:1;
unsigned logged:1;
unsigned buffered:4;
unsigned main_filter_need_in_memory:1;
unsigned filter_need_in_memory:1;
unsigned filter_need_temporary:1;
unsigned allow_ranges:1;
#if (NGX_STAT_STUB)
unsigned stat_reading:1;
unsigned stat_writing:1;
#endif
/* used to parse HTTP headers */
/*
通過列印,不能獲得header_name_start內容
通過列印,可以獲得header_start內容:為cookie內容+空行,也就是header_start內容包含cookie,但不僅僅包含cookie。
*/
ngx_uint_t state;
ngx_uint_t header_hash;
ngx_uint_t lowcase_index;
u_char lowcase_header[NGX_HTTP_LC_HEADER_LEN];
u_char * header_name_start;
u_char * header_name_end;
u_char * header_start;
u_char * header_end;
/*
* a memory that can be reused after parsing a request line
* via ngx_http_ephemeral_t
*/
/* used to parse HTTP 請求行的訊息
** 通過列印,可以知道接下來這部分內容都是關於HTTP請求行的,通過這些指標可以方便找到所需的請求行中的內容,比如 r-> method_end+1,r-> http_protocol .data-1 之間就是URI。
*/
u_char * uri_start;
u_char * uri_end;
u_char * uri_ext;
u_char * args_start;
u_char * request_start;
u_char * request_end;
u_char * method_end;
u_char * schema_start;
u_char * schema_end;
u_char * host_start;
u_char * host_end;
u_char * port_start;
u_char * port_end;
unsigned http_minor:16;
unsigned http_major:16;
};