【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);

原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3827172.html