ngx——请求处理——http报文解析

0. 报文数据来源

ngx——请求处理——http报文解析
数据存放在 c->buffer中,所以生命周期为一个 connection

1. 处理请求行

static void 
ngx_http_process_request_line(ngx_event_t *rev)   
{
  c = rev->data;       
  r = c->data;  

  rc = ngx_http_parse_request_line(r, r->header_in);    
  r->request_line.len = r->request_end - r->request_start;
  r->request_line.data = r->request_start; 
  r->request_length = r->header_in->pos - r->request_start;   
  r->method_name.len = r->method_end - r->request_start + 1;       
  r->method_name.data = r->request_line.data;    
  r->http_protocol.len = r->request_end - r->http_protocol.data;   
  ngx_http_process_request_uri(r); 

  ngx_list_init(&r->headers_in.headers, r->pool, 20,    sizeof(ngx_table_elt_t)) ;
  rev->handler = ngx_http_process_request_headers; 
  ngx_http_process_request_headers(rev);    

  r->request_length += r->header_in->pos - r->header_name_start;
  r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE;       
  rc = ngx_http_process_request_header(r);   
  ngx_http_process_request(r);    

  ngx_http_run_posted_requests(c); 
}

解析

ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)   

经过 ngx_http_parse_request_line 后 r的数据结构和 b如下
ngx——请求处理——http报文解析

经过整理得到
ngx——请求处理——http报文解析

ngx_http_process_request_uri : 解析 uri 和 args,包括uri的uri解码
得到r如下,arg没有,为NULL
ngx——请求处理——http报文解析

ngx_list_init(&r->headers_in.headers, r->pool, 20, sizeof(ngx_table_elt_t));

得到如下
ngx——请求处理——http报文解析

ngx_http_process_request_line(ngx_event_t *rev)
{
ngx_http_parse_header_line(r, r->header_in);
}

ngx_http_parse_header_line 对 请求头信息解析,以 Host为例,可见,ngx会修改 b->pos 上的数据,直接将b->pos截断为多个字符串
ngx——请求处理——http报文解析

ngx_http_parse_header_line 还会根据 header的 key,调用各自的回调函数,
如 host为 ngx_http_process_host : 检查 host 格式是否合法,并设置请求的 虚拟主机

ngx_int_t
ngx_http_process_host(ngx_http_request_t *r, ngx_table_elt_t *h,   ngx_uint_t offset)   
{
   rc = ngx_http_validate_host(&host, r->pool, 0);  
   if (rc == NGX_DECLINED) {     
 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
client sent invalid host header"); 
  ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST);
  return NGX_ERROR;        
}
  if (r->headers_in.server.len) {   
  return NGX_OK;            
}

 if (ngx_http_set_virtual_server(r, &host) == NGX_ERROR) {      
 return NGX_ERROR;          
}
 r->headers_in.server = host; 
}

ngx——请求处理——http报文解析

ngx——请求处理——http报文解析

上一篇:SQL 多表条件查询完成 将超出警戒线的机器向相关人员发出告警


下一篇:VisualSVN---You don't have permission to access on this server/Access ...forbidden