diff options
author | Igor Sysoev <igor@sysoev.ru> | 2004-06-20 19:54:15 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2004-06-20 19:54:15 +0000 |
commit | 73a73b5a60b1c6c985f3e9a5d7cddbe292ad01a4 (patch) | |
tree | fe274167bb823494fe327e9f48a97a330cfe5c49 /src/http/ngx_http_request.c | |
parent | f7290501f2426950f6c3ff7a2e3280bfaa831f0b (diff) | |
download | nginx-73a73b5a60b1c6c985f3e9a5d7cddbe292ad01a4.tar.gz nginx-73a73b5a60b1c6c985f3e9a5d7cddbe292ad01a4.zip |
nginx-0.0.7-2004-06-20-23:54:15 import
Diffstat (limited to 'src/http/ngx_http_request.c')
-rw-r--r-- | src/http/ngx_http_request.c | 53 |
1 files changed, 39 insertions, 14 deletions
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c index 0f30a3177..814e582e8 100644 --- a/src/http/ngx_http_request.c +++ b/src/http/ngx_http_request.c @@ -1050,13 +1050,15 @@ static void ngx_http_set_write_handler(ngx_http_request_t *r) wev = r->connection->write; wev->event_handler = ngx_http_writer; - if (wev->delayed && wev->ready) { + if (wev->ready && r->delayed) { return; } clcf = ngx_http_get_module_loc_conf(r->main ? r->main : r, ngx_http_core_module); - ngx_add_timer(wev, clcf->send_timeout); + if (!r->delayed) { + ngx_add_timer(wev, clcf->send_timeout); + } wev->available = clcf->send_lowat; if (ngx_handle_write_event(wev, NGX_LOWAT_EVENT) == NGX_ERROR) { @@ -1080,15 +1082,36 @@ void ngx_http_writer(ngx_event_t *wev) c = wev->data; r = c->data; -#if 0 /* TODO: THINK */ - if (wev->delayed) { - return; - } -#endif - if (wev->timedout) { - ngx_http_client_error(r, 0, NGX_HTTP_REQUEST_TIME_OUT); - return; + if (!r->delayed) { + ngx_http_client_error(r, 0, NGX_HTTP_REQUEST_TIME_OUT); + return; + } + + wev->timedout = 0; + r->delayed = 0; + + if (!wev->ready) { + clcf = ngx_http_get_module_loc_conf(r->main ? r->main : r, + ngx_http_core_module); + ngx_add_timer(wev, clcf->send_timeout); + + wev->available = clcf->send_lowat; + + if (ngx_handle_write_event(wev, NGX_LOWAT_EVENT) == NGX_ERROR) { + ngx_http_close_request(r, 0); + ngx_http_close_connection(r->connection); + } + + return; + } + + } else { + if (r->delayed) { + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, wev->log, 0, + "http writer delayed"); + return; + } } rc = ngx_http_output_filter(r, NULL); @@ -1097,13 +1120,15 @@ void ngx_http_writer(ngx_event_t *wev) "http writer output filter: %d", rc); if (rc == NGX_AGAIN) { - if (!wev->ready) { - clcf = ngx_http_get_module_loc_conf(r->main ? r->main : r, - ngx_http_core_module); + clcf = ngx_http_get_module_loc_conf(r->main ? r->main : r, + ngx_http_core_module); + if (!wev->ready && !r->delayed) { ngx_add_timer(wev, clcf->send_timeout); } - if (ngx_handle_level_write_event(wev) == NGX_ERROR) { + wev->available = clcf->send_lowat; + + if (ngx_handle_write_event(wev, NGX_LOWAT_EVENT) == NGX_ERROR) { ngx_http_close_request(r, 0); ngx_http_close_connection(r->connection); } |