码迷,mamicode.com
首页 > Web开发 > 详细

ngx_http_wait_request_handler函数解析

时间:2016-04-20 13:48:17      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:nginx

在普通的http请求过程中,ngx_event_accept函数中ls->handler(c);调用了ngx_http_init_connection函数,ngx_http_init_connection函数会调用ngx_http_wait_request_handler。主要代码和解析如下。
   
查看事件是否已过期,如果已过期,直接断开连接
if (rev->timedout) {
    ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
    ngx_http_close_connection(c);
    return;
}

调用recv函数,接收数据。函数原型在ngx_recv.c中定义,根据是否使用kqueue(一种i/o复用技术),有两种函数定义。
n = c->recv(c, b->last, size);
if (n == NGX_AGAIN) 
{
    尚未有数据道来,由于Nginx的事件驱动机制,程序不会阻塞,注册读事件并返回。
    if (ngx_handle_read_event(rev, 0) != NGX_OK) 
    {
        ngx_http_close_connection(c);
        return;
    }
    连接有可能什么实质性工作都不做,所以暂且释放内存。
    if (ngx_pfree(c->pool, b->start) == NGX_OK) 
    {
        b->start = NULL;
    }
    return;
}
recv函数返回了错误,直接断开连接并返回。
if (n == NGX_ERROR) {
    ngx_http_close_connection(c);
    return;
}
client主动断开了连接。
if (n == 0) {
    ngx_log_error(NGX_LOG_INFO, c->log, 0,
                  "client closed connection");
    ngx_http_close_connection(c);
    return;
}
如果有类似于“listen 80 proxy_protocol;”的配置,尚未仔细研究
if (hc->proxy_protocol) {
        ...
    }

ngx_reusable_connection(c, 0);
调用ngx_http_create_request函数初始化一个ngx_http_request_t结构体。
c->data = ngx_http_create_request(c);
if (c->data == NULL) {
    ngx_http_close_connection(c);
    return;
}
将目标连接的读事件回调函数设置为处理处理请求行
rev->handler = ngx_http_process_request_line;
首次执行处理请求行函数,在ngx_http_process_request_line中
ngx_http_process_request_line(rev);


本文出自 “11480450” 博客,请务必保留此出处http://11490450.blog.51cto.com/11480450/1765681

ngx_http_wait_request_handler函数解析

标签:nginx

原文地址:http://11490450.blog.51cto.com/11480450/1765681

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!