【Nginx】处理用户请求
实际处理请求的方法ngx_http_mytest_handler(在配置配置项的回调方法中被调用(用于解析配置项))将接收一个ngx_http_request_t类型的参数,返回一个ngx_int_t类型的结果。
typedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r);
请求的所有信息都可以在传入的ngx_http_request_t类型参数r中获得。
typedef struct ngx_http_request_s ngx_http_request_t;
struct ngx_http_request_s
{
ngx_uint_t method;
ngx_uint_t http_version;
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;
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;
};
在对一个用户请求进行解析时,可以得到下列4类信息
1)方法名
2)URI
3)URL参数
4)协议版本
获取HTTP头部
在ngx_http_request_t *r中就可以取到请求中的HTTP头部。
struct ngx_http_request_s
{
ngx_buf_t *header_in;//指向nginx收到的未经解析的http头部
ngx_http_headers_in_t headers_in;//存储已经解析过的http头部
};
获取http包体
http包体的长度有可能非常大,如果试图一次性调用并读取完所有的包体,那么多半会阻塞Nginx进程。http框架提供了一种方法来异步地接受包体
ngx_int_t ngx_http_read_client_request_body(ngx_request_t *r,ngx_http_client_body_handler_pt post_handler);