首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

ngxin源码分析(八)——phase handler处理

2012-10-15 
ngxin源码分析(8)——phase handler处理nginx将请求的处理过程划分为11个phase(阶段),相当于是对请求处理的

ngxin源码分析(8)——phase handler处理

        nginx将请求的处理过程划分为11个phase(阶段),相当于是对请求处理的一种抽象,便于定制处理过程。这个11个phase,分别是(定义在http/ngx_http_core_module.h):

ngx_int_tngx_http_core_content_phase(ngx_http_request_t *r,    ngx_http_phase_handler_t *ph){    size_t     root;    ngx_int_t  rc;    ngx_str_t  path;    /*     * 在find config phase中如果匹配到的location具有handler,则会赋值给r->content_handler。     * 而这里可以看到,如果r->content_handler存在则只会执行这一个handler,然后返回。     * 也就是说如果location设置了handler,则只会执行这一个content handler,不会执行其他的。     */    if (r->content_handler) {        r->write_event_handler = ngx_http_request_empty_handler;        ngx_http_finalize_request(r, r->content_handler(r));        return NGX_OK;    }    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,                   "content phase: %ui", r->phase_handler);    rc = ph->handler(r);    if (rc != NGX_DECLINED) {        ngx_http_finalize_request(r, rc);        return NGX_OK;    }    /* handler返回NGX_DECLINED会由接下来的content handler继续处理 */    /* rc == NGX_DECLINED */    ph++;    /* 如果下一个handler的checker存在,则返回NGX_AGAIN,继续调用下一个handler */    if (ph->checker) {        r->phase_handler++;        return NGX_AGAIN;    }    /* no content handler was found */    if (r->uri.data[r->uri.len - 1] == '/') {        if (ngx_http_map_uri_to_path(r, &path, &root, 0) != NULL) {            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,                          "directory index of \"%s\" is forbidden", path.data);        }        ngx_http_finalize_request(r, NGX_HTTP_FORBIDDEN);        return NGX_OK;    }    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "no handler found");    ngx_http_finalize_request(r, NGX_HTTP_NOT_FOUND);    return NGX_OK;}
        这一篇介绍请求处理,下一篇我们来看看响应内容是如何输出的。

热点排行