ngx_int_t ngx_http_header_filter(ngx_http_request_t *r)
{
ngx_chain_t out;
if (r->header_sent) return NGX_OK;
r->header_sent = 1;
//将r->header_outs的内容序列化为http包头
......
return
ngx_http_write_filter(r, &out);
//发送包头
}
|
ngx_int_t ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)
{
ngx_chain_t *chain;
ngx_connection_t *c;
c = r->connection;
...
//将in追加如r->out的尾部。
if (c->write->delayed) {
c->buffered |= NGX_HTTP_WRITE_BUFFERED;
return NGX_AGAIN;
}
//send_chain返回的是没有发完的chain
chain = c->
send_chain(c, r->out, limit);
r->out = chain;
//如果chain不为空,那么buf没有发送完,需要设置buffered标记,并返回NGX_AGAIN
if (chain)
{
c->
buffered |= NGX_HTTP_WRITE_BUFFERED;
return
NGX_AGAIN;
}
//如果已经没有未发送的chain,就清空buffered标记
c->buffered &= ~NGX_HTTP_WRITE_BUFFERED;
//如果其他filter模块buffer了chain并且postponed为NULL,那么返回NGX_AGAIN,需要继续处理buf
if ((c->buffered & NGX_LOWLEVEL_BUFFERED) && r->postponed == NULL) {
return
NGX_AGAIN;
}
return
NGX_OK;
}
|
void ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
{
if (rc ==
NGX_DONE) {
ngx_http_finalize_connection(r);
return;
}
if (rc ==
NGX_OK && r->filter_finalize) {
c->error = 1;
}
if (rc ==
NGX_DECLINED) {
r->content_handler = NULL;
r->write_event_handler =
ngx_http_core_run_phases;
ngx_http_core_run_phases(r);
return;
}
if (rc ==
NGX_ERROR
|| rc == NGX_HTTP_REQUEST_TIME_OUT
|| rc == NGX_HTTP_CLIENT_CLOSED_REQUEST
|| c->error)
{
if (ngx_http_post_action(r) == NGX_OK)
return;
if (r->main->blocked)
r->write_event_handler = ngx_http_request_finalizer;
ngx_http_terminate_request(r, rc);
return;
}
...
if (r->buffered || c->
buffered || r->postponed || r->blocked) {
//这里应该就是默认的NGX_AGAIN
if (
ngx_http_set_write_handler(r) != NGX_OK)
ngx_http_terminate_request(r, 0);
return;
}
if (c->read->eof) {
ngx_http_close_request(r, 0);
return;
}
ngx_http_finalize_connection(r);
}
|
ngx_int_t
ngx_http_set_write_handler(ngx_http_request_t *r)
{
ngx_event_t *wev;
ngx_http_core_loc_conf_t *clcf;
r->http_state = NGX_HTTP_WRITING_REQUEST_STATE;
r->write_event_handler =
ngx_http_writer;
wev = r->connection->write;
...
if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {
ngx_http_close_request(r, 0);
return NGX_ERROR;
}
return NGX_OK;
}
|
void ngx_http_writer(ngx_http_request_t *r)
{
int rc;
ngx_event_t *wev;
ngx_connection_t *c;
ngx_http_core_loc_conf_t *clcf;
c = r->connection;
wev = c->write;
clcf = ngx_http_get_module_loc_conf(r->main, ngx_http_core_module);
//首先处理写事件超时
if (wev->timedout)
{
if (!wev->delayed)
{
c->timedout = 1;
ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);
return;
}
wev->timedout = 0;
wev->delayed = 0;
//如果写事件延迟了但仍未准备好,重新放入epoll事件
if (!wev->ready)
{
ngx_add_timer(wev, clcf->send_timeout);
if (
ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK)
ngx_http_close_request(r, 0);
return;
}
}
//未超时时,但事件需要延期,重新加入epoll事件。
if (wev->delayed || r->aio)
{
if (
ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK)
ngx_http_close_request(r, 0);
return;
}
rc =
ngx_http_output_filter(r, NULL);
if (rc == NGX_ERROR)
{
ngx_http_finalize_request(r, rc);
return;
}
//已经发送完了包了,如果当前还在接收数据,或需要延期时,进行的处理
if (r->buffered || r->postponed || (r == r->main && c->buffered))
{
//如果没有写延期,将启动超时定时器
if (!wev->delayed)
ngx_add_timer(wev, clcf->send_timeout);
//将当前写事件加入epoll中等待处理。
if (
ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK)
ngx_http_close_request(r, 0);
return;
}
//即不再处理写事件了
r->write_event_handler = ngx_http_request_empty_handler;
ngx_http_finalize_request(r,
rc);
}
|
typedef ngx_int_t (*ngx_http_output_body_filter_pt)(ngx_http_request_t *r, ngx_chain_t *chain);
ngx_http_output_body_filter_pt ngx_http_top_body_filter;
ngx_int_t
ngx_http_output_filter(ngx_http_request_t *r, ngx_chain_t *in)
{
return ngx_http_top_body_filter(r, in);
}
|
//ngx_http_write_filter_module.c:
//ngx_http_write_filter_module_ctx的postconfiguration函数
ngx_int_t ngx_http_write_filter_init(ngx_conf_t *cf)
{
ngx_http_top_body_filter =
ngx_http_write_filter;
return NGX_OK;
}
//ngx_http_copy_filter_module.c:
static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
ngx_int_t ngx_http_copy_filter_init(ngx_conf_t *cf)
{
ngx_http_next_body_filter = ngx_http_top_body_filter;
ngx_http_top_body_filter = ngx_http_copy_filter;
return NGX_OK;
}
//ngx_http_postpone_filter_module.c:
static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
ngx_int_t ngx_http_postpone_filter_init(ngx_conf_t *cf)
{
ngx_http_next_body_filter = ngx_http_top_body_filter;
ngx_http_top_body_filter = ngx_http_postpone_filter;
return NGX_OK;
}
|
void ngx_http_close_request(ngx_http_request_t *r, ngx_int_t rc)
{
ngx_connection_t *c;
r = r->main;
c = r->connection;
r->count--;
if (r->count || r->blocked)
return;
ngx_http_free_request(r, rc);
ngx_http_close_connection(c);
}
|
ngx_int_t ngx_http_header_filter(ngx_http_request_t *r)
{
ngx_chain_t out;
if (r->header_sent) return NGX_OK;
r->header_sent = 1;
//将r->header_outs的内容序列化为http包头
......
return
ngx_http_write_filter(r, &out);
//发送包头
}
|
ngx_int_t ngx_http_write_filter(ngx_http_request_t *r, ngx_chain_t *in)
{
ngx_chain_t *chain;
ngx_connection_t *c;
c = r->connection;
...
//将in追加如r->out的尾部。
if (c->write->delayed) {
c->buffered |= NGX_HTTP_WRITE_BUFFERED;
return NGX_AGAIN;
}
//send_chain返回的是没有发完的chain
chain = c->
send_chain(c, r->out, limit);
r->out = chain;
//如果chain不为空,那么buf没有发送完,需要设置buffered标记,并返回NGX_AGAIN
if (chain)
{
c->
buffered |= NGX_HTTP_WRITE_BUFFERED;
return
NGX_AGAIN;
}
//如果已经没有未发送的chain,就清空buffered标记
c->buffered &= ~NGX_HTTP_WRITE_BUFFERED;
//如果其他filter模块buffer了chain并且postponed为NULL,那么返回NGX_AGAIN,需要继续处理buf
if ((c->buffered & NGX_LOWLEVEL_BUFFERED) && r->postponed == NULL) {
return
NGX_AGAIN;
}
return
NGX_OK;
}
|
void ngx_http_finalize_request(ngx_http_request_t *r, ngx_int_t rc)
{
if (rc ==
NGX_DONE) {
ngx_http_finalize_connection(r);
return;
}
if (rc ==
NGX_OK && r->filter_finalize) {
c->error = 1;
}
if (rc ==
NGX_DECLINED) {
r->content_handler = NULL;
r->write_event_handler =
ngx_http_core_run_phases;
ngx_http_core_run_phases(r);
return;
}
if (rc ==
NGX_ERROR
|| rc == NGX_HTTP_REQUEST_TIME_OUT
|| rc == NGX_HTTP_CLIENT_CLOSED_REQUEST
|| c->error)
{
if (ngx_http_post_action(r) == NGX_OK)
return;
if (r->main->blocked)
r->write_event_handler = ngx_http_request_finalizer;
ngx_http_terminate_request(r, rc);
return;
}
...
if (r->buffered || c->
buffered || r->postponed || r->blocked) {
//这里应该就是默认的NGX_AGAIN
if (
ngx_http_set_write_handler(r) != NGX_OK)
ngx_http_terminate_request(r, 0);
return;
}
if (c->read->eof) {
ngx_http_close_request(r, 0);
return;
}
ngx_http_finalize_connection(r);
}
|
ngx_int_t
ngx_http_set_write_handler(ngx_http_request_t *r)
{
ngx_event_t *wev;
ngx_http_core_loc_conf_t *clcf;
r->http_state = NGX_HTTP_WRITING_REQUEST_STATE;
r->write_event_handler =
ngx_http_writer;
wev = r->connection->write;
...
if (ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK) {
ngx_http_close_request(r, 0);
return NGX_ERROR;
}
return NGX_OK;
}
|
void ngx_http_writer(ngx_http_request_t *r)
{
int rc;
ngx_event_t *wev;
ngx_connection_t *c;
ngx_http_core_loc_conf_t *clcf;
c = r->connection;
wev = c->write;
clcf = ngx_http_get_module_loc_conf(r->main, ngx_http_core_module);
//首先处理写事件超时
if (wev->timedout)
{
if (!wev->delayed)
{
c->timedout = 1;
ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);
return;
}
wev->timedout = 0;
wev->delayed = 0;
//如果写事件延迟了但仍未准备好,重新放入epoll事件
if (!wev->ready)
{
ngx_add_timer(wev, clcf->send_timeout);
if (
ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK)
ngx_http_close_request(r, 0);
return;
}
}
//未超时时,但事件需要延期,重新加入epoll事件。
if (wev->delayed || r->aio)
{
if (
ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK)
ngx_http_close_request(r, 0);
return;
}
rc =
ngx_http_output_filter(r, NULL);
if (rc == NGX_ERROR)
{
ngx_http_finalize_request(r, rc);
return;
}
//已经发送完了包了,如果当前还在接收数据,或需要延期时,进行的处理
if (r->buffered || r->postponed || (r == r->main && c->buffered))
{
//如果没有写延期,将启动超时定时器
if (!wev->delayed)
ngx_add_timer(wev, clcf->send_timeout);
//将当前写事件加入epoll中等待处理。
if (
ngx_handle_write_event(wev, clcf->send_lowat) != NGX_OK)
ngx_http_close_request(r, 0);
return;
}
//即不再处理写事件了
r->write_event_handler = ngx_http_request_empty_handler;
ngx_http_finalize_request(r,
rc);
}
|
typedef ngx_int_t (*ngx_http_output_body_filter_pt)(ngx_http_request_t *r, ngx_chain_t *chain);
ngx_http_output_body_filter_pt ngx_http_top_body_filter;
ngx_int_t
ngx_http_output_filter(ngx_http_request_t *r, ngx_chain_t *in)
{
return ngx_http_top_body_filter(r, in);
}
|
//ngx_http_write_filter_module.c:
//ngx_http_write_filter_module_ctx的postconfiguration函数
ngx_int_t ngx_http_write_filter_init(ngx_conf_t *cf)
{
ngx_http_top_body_filter =
ngx_http_write_filter;
return NGX_OK;
}
//ngx_http_copy_filter_module.c:
static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
ngx_int_t ngx_http_copy_filter_init(ngx_conf_t *cf)
{
ngx_http_next_body_filter = ngx_http_top_body_filter;
ngx_http_top_body_filter = ngx_http_copy_filter;
return NGX_OK;
}
//ngx_http_postpone_filter_module.c:
static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
ngx_int_t ngx_http_postpone_filter_init(ngx_conf_t *cf)
{
ngx_http_next_body_filter = ngx_http_top_body_filter;
ngx_http_top_body_filter = ngx_http_postpone_filter;
return NGX_OK;
}
|
void ngx_http_close_request(ngx_http_request_t *r, ngx_int_t rc)
{
ngx_connection_t *c;
r = r->main;
c = r->connection;
r->count--;
if (r->count || r->blocked)
return;
ngx_http_free_request(r, rc);
ngx_http_close_connection(c);
}
|