# HG changeset patch # User Roman Arutyunyan # Date 1589892457 -10800 # Node ID d6feece1288a52b7ace77a4bf0edf9e5b84e3d89 # Parent 66feab03d9b78fa5e734e2a3f92ca387b3cdbd7c Fixed $request_length for HTTP/3. New field r->parse_start is introduced to substitute r->request_start and r->header_name_start for request length accounting. These fields only work for this purpose in HTTP/1 because HTTP/1 request line and header line start with these values. Also, error logging is now fixed to output the right part of the request. diff -r 66feab03d9b7 -r d6feece1288a src/http/ngx_http_parse.c --- a/src/http/ngx_http_parse.c Tue May 19 15:34:00 2020 +0300 +++ b/src/http/ngx_http_parse.c Tue May 19 15:47:37 2020 +0300 @@ -143,6 +143,7 @@ /* HTTP methods: GET, HEAD, POST */ case sw_start: + r->parse_start = p; r->request_start = p; r->method_start = p; @@ -883,6 +884,7 @@ /* first char */ case sw_start: + r->parse_start = p; r->header_name_start = p; r->invalid_header = 0; diff -r 66feab03d9b7 -r d6feece1288a src/http/ngx_http_request.c --- a/src/http/ngx_http_request.c Tue May 19 15:34:00 2020 +0300 +++ b/src/http/ngx_http_request.c Tue May 19 15:47:37 2020 +0300 @@ -1178,7 +1178,7 @@ r->request_line.len = r->request_end - r->request_start; r->request_line.data = r->request_start; - r->request_length = r->header_in->pos - r->request_start; /* XXX */ + r->request_length = r->header_in->pos - r->parse_start; ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, "http request line: \"%V\"", &r->request_line); @@ -1293,8 +1293,8 @@ } if (rv == NGX_DECLINED) { - r->request_line.len = r->header_in->end - r->request_start; - r->request_line.data = r->request_start; + r->request_line.len = r->header_in->end - r->parse_start; + r->request_line.data = r->parse_start; ngx_log_error(NGX_LOG_INFO, c->log, 0, "client sent too long URI"); @@ -1470,7 +1470,7 @@ } if (rv == NGX_DECLINED) { - p = r->header_name_start; + p = r->parse_start; r->lingering_close = 1; @@ -1490,7 +1490,7 @@ ngx_log_error(NGX_LOG_INFO, c->log, 0, "client sent too long header line: \"%*s...\"", - len, r->header_name_start); + len, r->parse_start); ngx_http_finalize_request(r, NGX_HTTP_REQUEST_HEADER_TOO_LARGE); @@ -1523,8 +1523,7 @@ if (rc == NGX_OK) { - /* XXX */ - r->request_length += r->header_in->pos - r->header_name_start; + r->request_length += r->header_in->pos - r->parse_start; if (r->invalid_header && cscf->ignore_invalid_headers) { @@ -1596,7 +1595,7 @@ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http header done"); - r->request_length += r->header_in->pos - r->header_name_start; /* XXX */ + r->request_length += r->header_in->pos - r->parse_start; r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE; @@ -1711,7 +1710,7 @@ return NGX_OK; } - old = request_line ? r->request_start : r->header_name_start; /* XXX */ + old = r->parse_start; cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); @@ -1783,6 +1782,8 @@ b->pos = new + (r->header_in->pos - old); b->last = new + (r->header_in->pos - old); + r->parse_start = new; + if (request_line) { r->request_start = new; @@ -3892,15 +3893,15 @@ len -= p - buf; buf = p; - if (r->request_line.data == NULL && r->request_start) { - for (p = r->request_start; p < r->header_in->last; p++) { + if (r->request_line.data == NULL && r->parse_start) { + for (p = r->parse_start; p < r->header_in->last; p++) { if (*p == CR || *p == LF) { break; } } - r->request_line.len = p - r->request_start; - r->request_line.data = r->request_start; + r->request_line.len = p - r->parse_start; + r->request_line.data = r->parse_start; } if (r->request_line.len) { diff -r 66feab03d9b7 -r d6feece1288a src/http/ngx_http_request.h --- a/src/http/ngx_http_request.h Tue May 19 15:34:00 2020 +0300 +++ b/src/http/ngx_http_request.h Tue May 19 15:47:37 2020 +0300 @@ -579,6 +579,7 @@ * via ngx_http_ephemeral_t */ + u_char *parse_start; u_char *uri_start; u_char *uri_end; u_char *uri_ext; diff -r 66feab03d9b7 -r d6feece1288a src/http/v3/ngx_http_v3_request.c --- a/src/http/v3/ngx_http_v3_request.c Tue May 19 15:34:00 2020 +0300 +++ b/src/http/v3/ngx_http_v3_request.c Tue May 19 15:47:37 2020 +0300 @@ -59,6 +59,7 @@ } r->h3_parse = st; + r->parse_start = b->pos; } while (b->pos < b->last) { @@ -130,6 +131,7 @@ st = r->h3_parse; if (st->header_rep.state == 0) { + r->parse_start = b->pos; r->invalid_header = 0; }