From 1134c4cd6ecdbee630a3080b6582a1665b7eeca6 Mon Sep 17 00:00:00 2001 From: Hakase Date: Sat, 22 Sep 2018 01:04:12 +0900 Subject: [PATCH] Latest update - 7355 --- src/http/modules/ngx_http_rewrite_module.c | 10 +---- src/http/ngx_http_request.c | 50 +++++++++++----------- src/http/v2/ngx_http_v2.c | 18 ++++++-- 3 files changed, 41 insertions(+), 37 deletions(-) diff --git a/src/http/modules/ngx_http_rewrite_module.c b/src/http/modules/ngx_http_rewrite_module.c index a6f1fc8..3b49c45 100644 --- a/src/http/modules/ngx_http_rewrite_module.c +++ b/src/http/modules/ngx_http_rewrite_module.c @@ -180,15 +180,7 @@ ngx_http_rewrite_handler(ngx_http_request_t *r) code(e); } - if (e->status < NGX_HTTP_BAD_REQUEST) { - return e->status; - } - - if (r->err_status == 0) { - return e->status; - } - - return r->err_status; + return e->status; } diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c index a2d3ebe..4bbc170 100644 --- a/src/http/ngx_http_request.c +++ b/src/http/ngx_http_request.c @@ -962,7 +962,7 @@ ngx_http_process_request_line(ngx_event_t *rev) n = ngx_http_read_request_header(r); if (n == NGX_AGAIN || n == NGX_ERROR) { - return; + break; } } @@ -987,7 +987,7 @@ ngx_http_process_request_line(ngx_event_t *rev) } if (ngx_http_process_request_uri(r) != NGX_OK) { - return; + break; } if (r->schema_end) { @@ -1006,16 +1006,16 @@ ngx_http_process_request_line(ngx_event_t *rev) ngx_log_error(NGX_LOG_INFO, c->log, 0, "client sent invalid host in request line"); ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - return; + break; } if (rc == NGX_ERROR) { ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; + break; } if (ngx_http_set_virtual_server(r, &host) == NGX_ERROR) { - return; + break; } r->headers_in.server = host; @@ -1027,11 +1027,11 @@ ngx_http_process_request_line(ngx_event_t *rev) && ngx_http_set_virtual_server(r, &r->headers_in.server) == NGX_ERROR) { - return; + break; } ngx_http_process_request(r); - return; + break; } @@ -1040,7 +1040,7 @@ ngx_http_process_request_line(ngx_event_t *rev) != NGX_OK) { ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; + break; } c->log->action = "reading client request headers"; @@ -1048,7 +1048,7 @@ ngx_http_process_request_line(ngx_event_t *rev) rev->handler = ngx_http_process_request_headers; ngx_http_process_request_headers(rev); - return; + break; } if (rc != NGX_AGAIN) { @@ -1065,7 +1065,7 @@ ngx_http_process_request_line(ngx_event_t *rev) (r->http_connection->ssl && clcf->strict_sni && clcf->strict_sni_header) ? ngx_http_terminate_request(r, 0) : ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); } - return; + break; } /* NGX_AGAIN: a request line parsing is still incomplete */ @@ -1076,7 +1076,7 @@ ngx_http_process_request_line(ngx_event_t *rev) if (rv == NGX_ERROR) { ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; + break; } if (rv == NGX_DECLINED) { @@ -1086,10 +1086,12 @@ ngx_http_process_request_line(ngx_event_t *rev) ngx_log_error(NGX_LOG_INFO, c->log, 0, "client sent too long URI"); ngx_http_finalize_request(r, NGX_HTTP_REQUEST_URI_TOO_LARGE); - return; + break; } } } + + ngx_http_run_posted_requests(c); } @@ -1251,7 +1253,7 @@ ngx_http_process_request_headers(ngx_event_t *rev) if (rv == NGX_ERROR) { ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; + break; } if (rv == NGX_DECLINED) { @@ -1264,7 +1266,7 @@ ngx_http_process_request_headers(ngx_event_t *rev) "client sent too large request"); ngx_http_finalize_request(r, NGX_HTTP_REQUEST_HEADER_TOO_LARGE); - return; + break; } len = r->header_in->end - p; @@ -1279,14 +1281,14 @@ ngx_http_process_request_headers(ngx_event_t *rev) ngx_http_finalize_request(r, NGX_HTTP_REQUEST_HEADER_TOO_LARGE); - return; + break; } } n = ngx_http_read_request_header(r); if (n == NGX_AGAIN || n == NGX_ERROR) { - return; + break; } } @@ -1316,7 +1318,7 @@ ngx_http_process_request_headers(ngx_event_t *rev) h = ngx_list_push(&r->headers_in.headers); if (h == NULL) { ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; + break; } h->hash = r->header_hash; @@ -1332,7 +1334,7 @@ ngx_http_process_request_headers(ngx_event_t *rev) h->lowcase_key = ngx_pnalloc(r->pool, h->key.len); if (h->lowcase_key == NULL) { ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); - return; + break; } if (h->key.len == r->lowcase_index) { @@ -1346,7 +1348,7 @@ ngx_http_process_request_headers(ngx_event_t *rev) h->lowcase_key, h->key.len); if (hh && hh->handler(r, h, hh->offset) != NGX_OK) { - return; + break; } ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, @@ -1370,12 +1372,12 @@ ngx_http_process_request_headers(ngx_event_t *rev) rc = ngx_http_process_request_header(r); if (rc != NGX_OK) { - return; + break; } ngx_http_process_request(r); - return; + break; } if (rc == NGX_AGAIN) { @@ -1391,8 +1393,10 @@ ngx_http_process_request_headers(ngx_event_t *rev) "client sent invalid header line"); ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - return; + break; } + + ngx_http_run_posted_requests(c); } @@ -1954,8 +1958,6 @@ ngx_http_process_request(ngx_http_request_t *r) r->read_event_handler = ngx_http_block_reading; ngx_http_handler(r); - - ngx_http_run_posted_requests(c); } diff --git a/src/http/v2/ngx_http_v2.c b/src/http/v2/ngx_http_v2.c index c18b60c..876e63c 100644 --- a/src/http/v2/ngx_http_v2.c +++ b/src/http/v2/ngx_http_v2.c @@ -2683,11 +2683,13 @@ error: if (rc == NGX_ABORT) { /* header handler has already finalized request */ + ngx_http_run_posted_requests(fc); return NULL; } if (rc == NGX_DECLINED) { ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); + ngx_http_run_posted_requests(fc); return NULL; } @@ -3752,18 +3754,22 @@ ngx_http_v2_construct_cookie_header(ngx_http_request_t *r) static void ngx_http_v2_run_request(ngx_http_request_t *r) { + ngx_connection_t *fc; + + fc = r->connection; + if (ngx_http_v2_construct_request_line(r) != NGX_OK) { - return; + goto failed; } if (ngx_http_v2_construct_cookie_header(r) != NGX_OK) { - return; + goto failed; } r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE; if (ngx_http_process_request_header(r) != NGX_OK) { - return; + goto failed; } if (r->headers_in.content_length_n > 0 && r->stream->in_closed) { @@ -3773,7 +3779,7 @@ ngx_http_v2_run_request(ngx_http_request_t *r) r->stream->skip_data = 1; ngx_http_finalize_request(r, NGX_HTTP_BAD_REQUEST); - return; + goto failed; } if (r->headers_in.content_length_n == -1 && !r->stream->in_closed) { @@ -3781,6 +3787,10 @@ ngx_http_v2_run_request(ngx_http_request_t *r) } ngx_http_process_request(r); + +failed: + + ngx_http_run_posted_requests(fc); }