mirror of
https://github.com/nginx/nginx.git
synced 2026-08-04 14:58:20 +00:00
Fixed handling of already closed connections.
In limit_req, auth_delay, and upstream code to check for broken connections, tests for possible connection close by the client did not work if the connection was already closed when relevant event handler was set. This happened because there were no additional events in case of edge-triggered event methods, and read events were disabled in case of level-triggered ones. Fix is to explicitly post a read event if the c->read->ready flag is set.
This commit is contained in:
parent
8885c45e1e
commit
179c79ce8a
3 changed files with 22 additions and 7 deletions
|
|
@ -310,8 +310,13 @@ ngx_http_limit_req_handler(ngx_http_request_t *r)
|
|||
|
||||
r->main->limit_req_status = NGX_HTTP_LIMIT_REQ_DELAYED;
|
||||
|
||||
if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) {
|
||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||
if (r->connection->read->ready) {
|
||||
ngx_post_event(r->connection->read, &ngx_posted_events);
|
||||
|
||||
} else {
|
||||
if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) {
|
||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
r->read_event_handler = ngx_http_test_reading;
|
||||
|
|
|
|||
|
|
@ -1190,8 +1190,13 @@ ngx_http_core_auth_delay(ngx_http_request_t *r)
|
|||
ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
|
||||
"delaying unauthorized request");
|
||||
|
||||
if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) {
|
||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||
if (r->connection->read->ready) {
|
||||
ngx_post_event(r->connection->read, &ngx_posted_events);
|
||||
|
||||
} else {
|
||||
if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) {
|
||||
return NGX_HTTP_INTERNAL_SERVER_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
r->read_event_handler = ngx_http_test_reading;
|
||||
|
|
|
|||
|
|
@ -608,9 +608,14 @@ ngx_http_upstream_init_request(ngx_http_request_t *r)
|
|||
|
||||
if (!u->store && !r->post_action && !u->conf->ignore_client_abort) {
|
||||
|
||||
if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) {
|
||||
ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
|
||||
return;
|
||||
if (r->connection->read->ready) {
|
||||
ngx_post_event(r->connection->read, &ngx_posted_events);
|
||||
|
||||
} else {
|
||||
if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) {
|
||||
ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
r->read_event_handler = ngx_http_upstream_rd_check_broken_connection;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue