0. 报文数据来源
数据存放在 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_process_request_uri : 解析 uri 和 args,包括uri的uri解码
得到r如下,arg没有,为NULL
ngx_list_init(&r->headers_in.headers, r->pool, 20, sizeof(ngx_table_elt_t));
得到如下
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_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;
}