Mercurial > hg > nginx
diff src/http/ngx_http_request.c @ 294:5cfd65b8b0a7
nginx-0.0.3-2004-03-23-09:01:52 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 23 Mar 2004 06:01:52 +0000 |
parents | ec3c049681fd |
children | 4a3f18406832 |
line wrap: on
line diff
--- a/src/http/ngx_http_request.c +++ b/src/http/ngx_http_request.c @@ -38,8 +38,7 @@ static char *client_header_errors[] = { "client %s sent invalid header, URL: %s", "client %s sent too long header line, URL: %s", "client %s sent HTTP/1.1 request without \"Host\" header, URL: %s", - "client %s sent invalid \"Content-Length\" header, URL: %s", - "client %s wanted to send too large body: " SIZE_T_FMT " bytes, URL: %s" + "client %s sent invalid \"Content-Length\" header, URL: %s" }; @@ -248,12 +247,21 @@ static void ngx_http_init_request(ngx_ev r->cleanup.size = sizeof(ngx_http_cleanup_t); r->cleanup.pool = r->pool; - /* TODO: ngx_init_table */ - if (!(r->headers_out.headers = ngx_create_table(r->pool, 20))) { + + /* init the r->headers_out.headers table */ + + r->headers_out.headers.elts = ngx_pcalloc(r->pool, + 20 * sizeof(ngx_table_elt_t)); + if (r->headers_out.headers.elts == NULL) { ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); ngx_http_close_connection(c); return; } + /* r->headers_out.headers.nelts = 0; */ + r->headers_out.headers.nalloc = 20; + r->headers_out.headers.size = sizeof(ngx_table_elt_t); + r->headers_out.headers.pool = r->pool; + r->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module); if (r->ctx == NULL) { @@ -469,11 +477,26 @@ static void ngx_http_process_request_lin return; } + + /* init the r->headers_in.headers table */ + + r->headers_in.headers.elts = ngx_pcalloc(r->pool, + 20 * sizeof(ngx_table_elt_t)); + if (r->headers_in.headers.elts == NULL) { + ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + ngx_http_close_connection(c); + return; + } + + /* r->headers_in.headers.elts = NULL; */ + /* r->headers_in.headers.nelts = 0; */ + r->headers_in.headers.size = sizeof(ngx_table_elt_t); + r->headers_in.headers.nalloc = 20; + r->headers_in.headers.pool = r->pool; + ctx = c->log->data; ctx->action = "reading client request headers"; ctx->url = r->unparsed_uri.data; - /* TODO: ngx_init_table */ - r->headers_in.headers = ngx_create_table(r->pool, 20); if (cscf->large_client_header && r->header_in->pos == r->header_in->last) @@ -848,21 +871,6 @@ static ngx_int_t ngx_http_process_reques if (r->headers_in.content_length_n == NGX_ERROR) { return NGX_HTTP_PARSE_INVALID_CL_HEADER; } - - clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module); - - ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, - "http cl: " SIZE_T_FMT " max: " SIZE_T_FMT, - r->headers_in.content_length_n, - clcf->client_max_body_size); - - if (clcf->client_max_body_size - && clcf->client_max_body_size - < (size_t) r->headers_in.content_length_n) - { - return NGX_HTTP_PARSE_ENTITY_TOO_LARGE; - } - } if (r->headers_in.connection) { @@ -913,6 +921,12 @@ void ngx_http_finalize_request(ngx_http_ ngx_del_timer(r->connection->write); } + if (rc == NGX_HTTP_CLIENT_CLOSED_REQUEST || r->closed) { + ngx_http_close_request(r, 0); + ngx_http_close_connection(r->connection); + return; + } + ngx_http_finalize_request(r, ngx_http_special_response_handler(r, rc)); return; @@ -1098,8 +1112,6 @@ int ngx_http_discard_body(ngx_http_reque } return ngx_http_read_discarded_body(r); - - return NGX_OK; } @@ -1158,7 +1170,15 @@ static int ngx_http_read_discarded_body( n = ngx_recv(r->connection, r->discarded_buffer, size); if (n == NGX_ERROR) { - return NGX_HTTP_BAD_REQUEST; + + r->closed = 1; + + /* + * when a client request body is discarded then we already set + * some HTTP response code for client and we can ignore the error + */ + + return NGX_OK; } if (n == NGX_AGAIN) { @@ -1606,19 +1626,9 @@ static void ngx_http_client_error(ngx_ht r->connection->log->handler = NULL; if (ctx->url) { - if (client_error == NGX_HTTP_PARSE_ENTITY_TOO_LARGE) { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, - client_header_errors[client_error - NGX_HTTP_CLIENT_ERROR], - ctx->client, r->headers_in.content_length_n, ctx->url); - - error = NGX_HTTP_REQUEST_ENTITY_TOO_LARGE; - r->lingering_close = 1; - - } else { - ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, + ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, client_header_errors[client_error - NGX_HTTP_CLIENT_ERROR], ctx->client, ctx->url); - } } else { if (error == NGX_HTTP_REQUEST_URI_TOO_LARGE) {