Description
/*
* HTTP does not define the code for the case when a client closed
* the connection while we are processing its request so we introduce
* own code to log such situation when a client has closed the connection
* before we even try to send the HTTP header to it
*/
#define NGX_HTTP_CLIENT_CLOSED_REQUEST 499While connecting to upstream
In ngx_http_upstream_connect(),
u->write_event_handler = ngx_http_upstream_send_request_handler;
u->read_event_handler = ngx_http_upstream_process_header;When ngx_http_upstream_next() is called,
if (r->connection->error) {
ngx_http_upstream_finalize_request(r, u,
NGX_HTTP_CLIENT_CLOSED_REQUEST);
return;
}In ngx_http_upstream_finalize_request(),
if (!u->header_sent
|| rc == NGX_HTTP_REQUEST_TIME_OUT
|| rc == NGX_HTTP_CLIENT_CLOSED_REQUEST)
{
ngx_http_finalize_request(r, rc);
return;
}In ngx_http_finalize_request(),
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;
}
ngx_http_terminate_request(r, rc);
return;
}ngx_http_terminate_request() then calls ngx_http_close_request(), which finally calls ngx_http_free_request() and ngx_http_close_connection(). The first logs the request, and the second calls ngx_close_connection(), which leads us to ngx_close_socket() that calls close().
Some other cases
ngx_http_upstream_init_request() first sets both event handlers to check for broken connections.
if (... && !u->conf->ignore_client_abort) {
...
r->read_event_handler = ngx_http_upstream_rd_check_broken_connection;
r->write_event_handler = ngx_http_upstream_wr_check_broken_connection;
}If request body is not buffered, ngx_http_upstream_send_request_body() sets the read_event_handler to ngx_http_upstream_read_request_handler, but restores it to ngx_http_upstream_rd_check_broken_connection() once the client request body is fully read.
Both check functions call ngx_http_upstream_check_broken_connection(), which would finalize the client-side connection in the same way.
if (!u->cacheable) {
ngx_http_upstream_finalize_request(r, u,
NGX_HTTP_CLIENT_CLOSED_REQUEST);
}