Mercurial > hg > nginx-vendor-1-0
diff src/http/ngx_http_request.c @ 276:c5c2b2883984 NGINX_0_5_8
nginx 0.5.8
*) Bugfix: a segmentation fault might occur if
"client_body_in_file_only on" was used and a request body was small.
*) Bugfix: a segmentation fault occurred if
"client_body_in_file_only on" and "proxy_pass_request_body off" or
"fastcgi_pass_request_body off" directives were used, and nginx
switched to a next upstream.
*) Bugfix: if the "proxy_buffering off" directive was used and a client
connection was non-active, then the connection was closed after send
timeout; bug appeared in 0.4.7.
*) Bugfix: if the "epoll" method was used and a client closed a
connection prematurely, then nginx closed the connection after a
send timeout only.
*) Bugfix: the "[alert] zero size buf" error when FastCGI server was
used.
*) Bugfixes in the "limit_zone" directive.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Fri, 19 Jan 2007 00:00:00 +0300 |
parents | 29a6403156b0 |
children | 675a39fd14cd |
line wrap: on
line diff
--- a/src/http/ngx_http_request.c +++ b/src/http/ngx_http_request.c @@ -141,6 +141,9 @@ ngx_http_header_t ngx_http_headers_in[] { ngx_string("Destination"), offsetof(ngx_http_headers_in_t, destination), ngx_http_process_header_line }, + { ngx_string("Overwrite"), offsetof(ngx_http_headers_in_t, overwrite), + ngx_http_process_header_line }, + { ngx_string("Date"), offsetof(ngx_http_headers_in_t, date), ngx_http_process_header_line }, #endif @@ -1762,20 +1765,77 @@ ngx_http_writer(ngx_http_request_t *r) static void ngx_http_block_read(ngx_http_request_t *r) { - ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http read blocked"); + int n; + char buf[1]; + ngx_err_t err; + ngx_event_t *rev; + ngx_connection_t *c; + + c = r->connection; + rev = c->read; + + ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http read blocked"); + +#if (NGX_HAVE_KQUEUE) + + if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { + + if (!rev->pending_eof) { + return; + } + + rev->eof = 1; + c->error = 1; + err = rev->kq_errno; + + goto closed; + } + +#endif + + n = recv(c->fd, buf, 1, MSG_PEEK); + + if (n == 0) { + rev->eof = 1; + c->error = 1; + err = 0; + + goto closed; + + } else if (n == -1) { + err = ngx_socket_errno; + + if (err != NGX_EAGAIN) { + rev->eof = 1; + c->error = 1; + + goto closed; + } + } /* aio does not call this handler */ - if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) - && r->connection->read->active) - { - if (ngx_del_event(r->connection->read, NGX_READ_EVENT, 0) - == NGX_ERROR) - { + if ((ngx_event_flags & NGX_USE_LEVEL_EVENT) && rev->active) { + + if (ngx_del_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) { ngx_http_close_request(r, 0); } } + + return; + +closed: + + if (err) { + rev->error = 1; + } + + ngx_log_error(NGX_LOG_INFO, c->log, err, + "client closed prematurely connection"); + + ngx_http_close_request(r, 0); + + return; }