struct ngx_http_request_s {
uint32_t signature; /* "HTTP" */ //请求对应的客户端连接
ngx_connection_t *connection; //指向存放所有HTTP模块的上下文结构体的指针数组
void **ctx;
//指向请求对应的存放main级别配置结构体的指针数组
void **main_conf;
//指向请求对应的存放srv级别配置结构体的指针数组
void **srv_conf;
//指向请求对应的存放loc级别配置结构体的指针数组
void **loc_conf; /*
* 在接收完http头部,第一次在业务上处理http请求时,http框架提供的处理方法是ngx_http_process_request。
但如果该方法无法一次处理完该请求的全部业务,在归还控制权到epoll时间模块后,该请求再次被回调时,
将通过Ngx_http_request_handler方法来处理,而这个方法中对于可读事件的处理就是调用read_event_handler处理请求。
也就是说,http模块希望在底层处理请求的读事件时,重新实现read_event_handler方法
*/
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;
ngx_array_t *upstream_states;
/* of ngx_http_upstream_state_t */ //这个请求的内存池
ngx_pool_t *pool;
//用于接收http请求内容的缓冲区,主要接收http头部
ngx_buf_t *header_in; //ngx_http_process_request_headers在接收、解析完http请求的头部后,会把解析完的每一个http头部加入到headers_in的headers链表中,同时会构造headers_in中的其他成员
ngx_http_headers_in_t headers_in;
//http模块会把想要发送的http相应信息放到headers_out中,期望http框架将headers_out中的成员序列化为http响应包发送给用户
ngx_http_headers_out_t headers_out; //接收请求中包体的数据结构
ngx_http_request_body_t *request_body; //延迟关闭连接的时间
time_t lingering_time;
//当前请求初始化时的时间
time_t start_sec;
ngx_msec_t start_msec; //下面的9个成员是函数ngx_http_process_request_line方法在接收、解析http请求行时解析出的信息
ngx_uint_t method;//方法名
ngx_uint_t http_version;//协议版本 ngx_str_t request_line;
ngx_str_t uri;//用户请求中的uri
ngx_str_t args;//用户请求中的url参数
ngx_str_t exten;//用户请求的文件扩展名
ngx_str_t unparsed_uri;//没有进行URL解码的原始请求 ngx_str_t method_name;//用户请求中的方法名字符串
ngx_str_t http_protocol;//其data成员指向请求中http起始地址 /*表示需要发送给客户端的http响应。out中保存着由headers_out中序列化后的表示http头部的TCP流。
* 在调用ngx_http_output_filter方法后,out中还会保存着待发送的http包体,它是实现异步发送http响应的关键。*/
ngx_chain_t *out;
/*当前请求既有可能是用户发来的请求,也可能是派生出的子请求。
* 而main标识一系列相关的派生子请求的原始请求。
* 一般可通过main和当前请求的地址是否相等来判断当前请求是否为用户发来的原始请求。*/
ngx_http_request_t *main;
//当前请求的父请求(不一定是原始请求)
ngx_http_request_t *parent;
//与subrequest子请求相关的功能
ngx_http_postponed_request_t *postponed;
ngx_http_post_subrequest_t *post_subrequest;
//所有的子请求都是通过这个单链表链接起来的
ngx_http_posted_request_t *posted_requests; /*全局的ngx_http_phase_engine_t结构体中定义了一个ngx_http_phase_handler_t回答方法组成的数组。
* 而phase_handler成员则与该数组配合使用。表示请求下次应当执行phase_handler作为序列号指定的数组中的回调方法*/
ngx_int_t phase_handler;
//表示NGX_HTTP_CONTENT_PHASE阶段提供给http模块处理请求的一种方式,它指向http模块实现的请求处理方法
ngx_http_handler_pt content_handler;
//在NGX_HTTP_ACCESS_PHASE节点需要判断请求是否具有访问权限时,通过access_code来传递http模块的handler回调方法的返回值,如果为0表示具备权限。否则不具备。
ngx_uint_t access_code; ngx_http_variable_value_t *variables; #if (NGX_PCRE)
ngx_uint_t ncaptures;
int *captures;
u_char *captures_data;
#endif size_t limit_rate; /* used to learn the Apache compatible response length without a header */
size_t header_size; //http请求的全部长度,包括http包体
off_t request_length; ngx_uint_t err_status; ngx_http_connection_t *http_connection;
#if (NGX_HTTP_SPDY)
ngx_http_spdy_stream_t *spdy_stream;
#endif ngx_http_log_handler_pt log_handler; //在这个请求中如果打开了某些资源,并需要在请求结束时释放,那么需要把定义的释放资源的方法添加到这个成员
ngx_http_cleanup_t *cleanup; unsigned subrequests:8;
//引用计数一般都作用于这个请求的原始请求上
//引用计数,每当派生出子请求时,原始请求的count成员都会加一
unsigned count:8;
//阻塞标志位,目前仅由aio使用
unsigned blocked:8; //标志位:为1表示蛋清请求正在使用异步IO
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; unsigned add_uri_to_alias:1;
unsigned valid_location:1;
unsigned valid_unparsed_uri:1;
//标志位:为1时表示URL发生过rewrite重写
unsigned uri_changed:1;
//表示使用rewrite重写URL的次数
unsigned uri_changes:4; 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 chunked:1;
unsigned header_only:1;
//标志位,为1表示当前请求时keepalive请求
unsigned keepalive:1;
//延迟关闭标志位
unsigned lingering_close:1;
//标志位:为1表示正在丢弃http请求中的包体
unsigned discard_body:1;
//标志位:为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;
//标志位:为1表示发生给客户端的http响应头已经发送
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 */ //状态机解析http时使用state来表示当前的解析状态,需要检查是否构成完成的http请求行
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
*/ 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;
};

 

转http://blog.csdn.net/xiajun07061225/article/details/9189505 

  1. struct ngx_http_request_s {
  2. uint32_t                          signature;         /* "HTTP" */
  3. //请求对应的客户端连接
  4. ngx_connection_t                 *connection;
  5. //指向存放所有HTTP模块的上下文结构体的指针数组
  6. void                            **ctx;
  7. //指向请求对应的存放main级别配置结构体的指针数组
  8. void                            **main_conf;
  9. //指向请求对应的存放srv级别配置结构体的指针数组
  10. void                            **srv_conf;
  11. //指向请求对应的存放loc级别配置结构体的指针数组
  12. void                            **loc_conf;
  13. /*
  14. * 在接收完http头部,第一次在业务上处理http请求时,http框架提供的处理方法是ngx_http_process_request。
  15. 但如果该方法无法一次处理完该请求的全部业务,在归还控制权到epoll时间模块后,该请求再次被回调时,
  16. 将通过Ngx_http_request_handler方法来处理,而这个方法中对于可读事件的处理就是调用read_event_handler处理请求。
  17. 也就是说,http模块希望在底层处理请求的读事件时,重新实现read_event_handler方法
  18. */
  19. ngx_http_event_handler_pt         read_event_handler;
  20. //与上面的方法类似
  21. ngx_http_event_handler_pt         write_event_handler;
  22. #if (NGX_HTTP_CACHE)
  23. ngx_http_cache_t                 *cache;
  24. #endif
  25. //upstream机制用到的结构体
  26. ngx_http_upstream_t              *upstream;
  27. ngx_array_t                      *upstream_states;
  28. /* of ngx_http_upstream_state_t */
  29. //这个请求的内存池
  30. ngx_pool_t                       *pool;
  31. //用于接收http请求内容的缓冲区,主要接收http头部
  32. ngx_buf_t                        *header_in;
  33. //ngx_http_process_request_headers在接收、解析完http请求的头部后,会把解析完的每一个http头部加入到headers_in的headers链表中,同时会构造headers_in中的其他成员
  34. ngx_http_headers_in_t             headers_in;
  35. //http模块会把想要发送的http相应信息放到headers_out中,期望http框架将headers_out中的成员序列化为http响应包发送给用户
  36. ngx_http_headers_out_t            headers_out;
  37. //接收请求中包体的数据结构
  38. ngx_http_request_body_t          *request_body;
  39. //延迟关闭连接的时间
  40. time_t                            lingering_time;
  41. //当前请求初始化时的时间
  42. time_t                            start_sec;
  43. ngx_msec_t                        start_msec;
  44. //下面的9个成员是函数ngx_http_process_request_line方法在接收、解析http请求行时解析出的信息
  45. ngx_uint_t                        method;//方法名
  46. ngx_uint_t                        http_version;//协议版本
  47. ngx_str_t                         request_line;
  48. ngx_str_t                         uri;//用户请求中的uri
  49. ngx_str_t                         args;//用户请求中的url参数
  50. ngx_str_t                         exten;//用户请求的文件扩展名
  51. ngx_str_t                         unparsed_uri;//没有进行URL解码的原始请求
  52. ngx_str_t                         method_name;//用户请求中的方法名字符串
  53. ngx_str_t                         http_protocol;//其data成员指向请求中http起始地址
  54. /*表示需要发送给客户端的http响应。out中保存着由headers_out中序列化后的表示http头部的TCP流。
  55. * 在调用ngx_http_output_filter方法后,out中还会保存着待发送的http包体,它是实现异步发送http响应的关键。*/
  56. ngx_chain_t                      *out;
  57. /*当前请求既有可能是用户发来的请求,也可能是派生出的子请求。
  58. * 而main标识一系列相关的派生子请求的原始请求。
  59. * 一般可通过main和当前请求的地址是否相等来判断当前请求是否为用户发来的原始请求。*/
  60. ngx_http_request_t               *main;
  61. //当前请求的父请求(不一定是原始请求)
  62. ngx_http_request_t               *parent;
  63. //与subrequest子请求相关的功能
  64. ngx_http_postponed_request_t     *postponed;
  65. ngx_http_post_subrequest_t       *post_subrequest;
  66. //所有的子请求都是通过这个单链表链接起来的
  67. ngx_http_posted_request_t        *posted_requests;
  68. /*全局的ngx_http_phase_engine_t结构体中定义了一个ngx_http_phase_handler_t回答方法组成的数组。
  69. * 而phase_handler成员则与该数组配合使用。表示请求下次应当执行phase_handler作为序列号指定的数组中的回调方法*/
  70. ngx_int_t                         phase_handler;
  71. //表示NGX_HTTP_CONTENT_PHASE阶段提供给http模块处理请求的一种方式,它指向http模块实现的请求处理方法
  72. ngx_http_handler_pt               content_handler;
  73. //在NGX_HTTP_ACCESS_PHASE节点需要判断请求是否具有访问权限时,通过access_code来传递http模块的handler回调方法的返回值,如果为0表示具备权限。否则不具备。
  74. ngx_uint_t                        access_code;
  75. ngx_http_variable_value_t        *variables;
  76. #if (NGX_PCRE)
  77. ngx_uint_t                        ncaptures;
  78. int                              *captures;
  79. u_char                           *captures_data;
  80. #endif
  81. size_t                            limit_rate;
  82. /* used to learn the Apache compatible response length without a header */
  83. size_t                            header_size;
  84. //http请求的全部长度,包括http包体
  85. off_t                             request_length;
  86. ngx_uint_t                        err_status;
  87. ngx_http_connection_t            *http_connection;
  88. #if (NGX_HTTP_SPDY)
  89. ngx_http_spdy_stream_t           *spdy_stream;
  90. #endif
  91. ngx_http_log_handler_pt           log_handler;
  92. //在这个请求中如果打开了某些资源,并需要在请求结束时释放,那么需要把定义的释放资源的方法添加到这个成员
  93. ngx_http_cleanup_t               *cleanup;
  94. unsigned                          subrequests:8;
  95. //引用计数一般都作用于这个请求的原始请求上
  96. //引用计数,每当派生出子请求时,原始请求的count成员都会加一
  97. unsigned                          count:8;
  98. //阻塞标志位,目前仅由aio使用
  99. unsigned                          blocked:8;
  100. //标志位:为1表示蛋清请求正在使用异步IO
  101. unsigned                          aio:1;
  102. unsigned                          http_state:4;
  103. /* URI with "/." and on Win32 with "//" */
  104. unsigned                          complex_uri:1;
  105. /* URI with "%" */
  106. unsigned                          quoted_uri:1;
  107. /* URI with "+" */
  108. unsigned                          plus_in_uri:1;
  109. /* URI with " " */
  110. unsigned                          space_in_uri:1;
  111. unsigned                          invalid_header:1;
  112. unsigned                          add_uri_to_alias:1;
  113. unsigned                          valid_location:1;
  114. unsigned                          valid_unparsed_uri:1;
  115. //标志位:为1时表示URL发生过rewrite重写
  116. unsigned                          uri_changed:1;
  117. //表示使用rewrite重写URL的次数
  118. unsigned                          uri_changes:4;
  119. unsigned                          request_body_in_single_buf:1;
  120. unsigned                          request_body_in_file_only:1;
  121. unsigned                          request_body_in_persistent_file:1;
  122. unsigned                          request_body_in_clean_file:1;
  123. unsigned                          request_body_file_group_access:1;
  124. unsigned                          request_body_file_log_level:3;
  125. unsigned                          subrequest_in_memory:1;
  126. unsigned                          waited:1;
  127. #if (NGX_HTTP_CACHE)
  128. unsigned                          cached:1;
  129. #endif
  130. #if (NGX_HTTP_GZIP)
  131. unsigned                          gzip_tested:1;
  132. unsigned                          gzip_ok:1;
  133. unsigned                          gzip_vary:1;
  134. #endif
  135. unsigned                          proxy:1;
  136. unsigned                          bypass_cache:1;
  137. unsigned                          no_cache:1;
  138. /*
  139. * instead of using the request context data in
  140. * ngx_http_limit_conn_module and ngx_http_limit_req_module
  141. * we use the single bits in the request structure
  142. */
  143. unsigned                          limit_conn_set:1;
  144. unsigned                          limit_req_set:1;
  145. #if 0
  146. unsigned                          cacheable:1;
  147. #endif
  148. unsigned                          pipeline:1;
  149. unsigned                          chunked:1;
  150. unsigned                          header_only:1;
  151. //标志位,为1表示当前请求时keepalive请求
  152. unsigned                          keepalive:1;
  153. //延迟关闭标志位
  154. unsigned                          lingering_close:1;
  155. //标志位:为1表示正在丢弃http请求中的包体
  156. unsigned                          discard_body:1;
  157. //标志位:为1表示请求的当前状态是在做内部跳转
  158. unsigned                          internal:1;
  159. unsigned                          error_page:1;
  160. unsigned                          ignore_content_encoding:1;
  161. unsigned                          filter_finalize:1;
  162. unsigned                          post_action:1;
  163. unsigned                          request_complete:1;
  164. unsigned                          request_output:1;
  165. //标志位:为1表示发生给客户端的http响应头已经发送
  166. unsigned                          header_sent:1;
  167. unsigned                          expect_tested:1;
  168. unsigned                          root_tested:1;
  169. unsigned                          done:1;
  170. unsigned                          logged:1;
  171. //标志位,表示缓冲中是否有待发送内容
  172. unsigned                          buffered:4;
  173. unsigned                          main_filter_need_in_memory:1;
  174. unsigned                          filter_need_in_memory:1;
  175. unsigned                          filter_need_temporary:1;
  176. unsigned                          allow_ranges:1;
  177. #if (NGX_STAT_STUB)
  178. unsigned                          stat_reading:1;
  179. unsigned                          stat_writing:1;
  180. #endif
  181. /* used to parse HTTP headers */
  182. //状态机解析http时使用state来表示当前的解析状态,需要检查是否构成完成的http请求行
  183. ngx_uint_t                        state;
  184. ngx_uint_t                        header_hash;
  185. ngx_uint_t                        lowcase_index;
  186. u_char                            lowcase_header[NGX_HTTP_LC_HEADER_LEN];
  187. u_char                           *header_name_start;
  188. u_char                           *header_name_end;
  189. u_char                           *header_start;
  190. u_char                           *header_end;
  191. /*
  192. * a memory that can be reused after parsing a request line
  193. * via ngx_http_ephemeral_t
  194. */
  195. u_char                           *uri_start;
  196. u_char                           *uri_end;
  197. u_char                           *uri_ext;
  198. u_char                           *args_start;
  199. u_char                           *request_start;
  200. u_char                           *request_end;
  201. u_char                           *method_end;
  202. u_char                           *schema_start;
  203. u_char                           *schema_end;
  204. u_char                           *host_start;
  205. u_char                           *host_end;
  206. u_char                           *port_start;
  207. u_char                           *port_end;
  208. unsigned                          http_minor:16;
  209. unsigned                          http_major:16;
  210. };

nginx的ngx_http_request_t结构体的更多相关文章

  1. Nginx学习之三-ngx_http_request_t结构体

    ngx_http_request_s是nginx中非常重要的一个结构体,贯穿于htpp请求处理的整个过程中. 下面解释了ngx_http_request_s结构体中与HTTP框架相关的重要的成员变量. ...

  2. Nginx之核心结构体ngx_cycle_t

    1. ngx_listening_t 结构体 ngx_cycle_t 对象中有一个动态数组成员叫做 listening,它的每个数组元素都是 ngx_listening_t 结构体,而每个 ngx_l ...

  3. 菜鸟学习-C语言函数参数传递详解-结构体与数组 分类: C/C++ Nginx 2015-07-14 10:24 89人阅读 评论(0) 收藏

    C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下 ...

  4. nginx取结构体地址

    linux内核提供了一个container_of()宏,可以根据结构体某个成员的地址找到父结构的地址. #define container_of(ptr, type, member) ({ \ con ...

  5. Nginx源码分析-ngx_module_s结构体

    该结构体是整个Nginx模块化架构最基本的数据结构体.它描述了Nginx程序中一个模块应该包括的基本属性,在tengine/src/core/ngx_conf_file.h中定义了该结构体 struc ...

  6. Go第六篇之结构体剖析

    Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类型可以被实例化,使用new或&a ...

  7. 06. Go 语言结构体

    Go语言结构体(struct) Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类 ...

  8. C语言根据结构体成员变量的地址,得到结构体的地址

    看nginx代码时发现双链表使用的是这种方法,记录一下 给出一个实例来说明 struct father_t {    int a;    char *b;    double c;}f;char *p ...

  9. Go结构体实现类似成员函数机制

    Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...

随机推荐

  1. Solr5 DataImport 处理1对多关系

    “问题” 和“派发处理” 是2个对象. 每个问题可以被派发N次, 最后结束问题. 实际查询中数据量可能很大,同时即可以从问题查派发部门, 也可以从派发情况查询问题(如本部门处理的问题) 使用的技巧就是 ...

  2. ACL权限设置命令setfacl和getfacl命令

    ACL权限设置命令setfacl和getfacl命令 setfacl命令是用来在命令行里设置ACL(访问控制列表).在命令行里,一系列的命令跟随以一系列的文件名. [TOC] 选项 |参数|说明|   ...

  3. cf 710 E Generate a String

    题意: 开始你有数字$0$,你可以用代价$x$将该数字加$1$或减$1$(当$x > 0$时),或用代价$y$将该数字变为$2x$,那么问得到数字$n$所需的最少代价是多少. 数据范围$1 \l ...

  4. mysql 链接失败(ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES))

    mysql链接失败(ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)) 修改: # ...

  5. AtCoder Grand Contest 008 A

    Problem Statement Snuke has a calculator. It has a display and two buttons. Initially, the display s ...

  6. WinSCP无法连接 ubuntu 的解决方法

    ubuntu默认不安装sshd服务 需要sudo apt-get install ssh 你可以在ubuntu本机ssh localhost测试是否成功安装了ssh 因为WinSCP是基于ssh的sf ...

  7. springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序

    springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序 http://www.360doc.com/content/14/03 ...

  8. css优先级问题

    关于CSS specificityCSS 的specificity 特性或称非凡性,它是衡量一个衡量CSS值优先级的一个标准,既然作为标准,就具有一套相关的判定规定及计算方式,specificity用 ...

  9. 后缀数组:倍增法和DC3的简单理解

    一些定义:设字符串S的长度为n,S[0~n-1]. 子串:设0<=i<=j<=n-1,那么由S的第i到第j个字符组成的串为它的子串S[i,j]. 后缀:设0<=i<=n- ...

  10. 关于欧几里得算法求最大公约数,即OJ1029的参考解法

    #include <stdio.h> int main(int argc, char *argv[]) { int a,b,c; scanf("%d %d",& ...