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;} 这一篇介绍请求处理,下一篇我们来看看响应内容是如何输出的。