Mercurial > hg > nginx
comparison src/http/ngx_http_request.c @ 8407:d6feece1288a quic
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.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Tue, 19 May 2020 15:47:37 +0300 |
parents | 66feab03d9b7 |
children | 5b367070cc9c |
comparison
equal
deleted
inserted
replaced
8406:66feab03d9b7 | 8407:d6feece1288a |
---|---|
1176 | 1176 |
1177 /* the request line has been parsed successfully */ | 1177 /* the request line has been parsed successfully */ |
1178 | 1178 |
1179 r->request_line.len = r->request_end - r->request_start; | 1179 r->request_line.len = r->request_end - r->request_start; |
1180 r->request_line.data = r->request_start; | 1180 r->request_line.data = r->request_start; |
1181 r->request_length = r->header_in->pos - r->request_start; /* XXX */ | 1181 r->request_length = r->header_in->pos - r->parse_start; |
1182 | 1182 |
1183 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, | 1183 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0, |
1184 "http request line: \"%V\"", &r->request_line); | 1184 "http request line: \"%V\"", &r->request_line); |
1185 | 1185 |
1186 r->method_name.len = r->method_end - r->method_start; | 1186 r->method_name.len = r->method_end - r->method_start; |
1291 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | 1291 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
1292 break; | 1292 break; |
1293 } | 1293 } |
1294 | 1294 |
1295 if (rv == NGX_DECLINED) { | 1295 if (rv == NGX_DECLINED) { |
1296 r->request_line.len = r->header_in->end - r->request_start; | 1296 r->request_line.len = r->header_in->end - r->parse_start; |
1297 r->request_line.data = r->request_start; | 1297 r->request_line.data = r->parse_start; |
1298 | 1298 |
1299 ngx_log_error(NGX_LOG_INFO, c->log, 0, | 1299 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
1300 "client sent too long URI"); | 1300 "client sent too long URI"); |
1301 ngx_http_finalize_request(r, NGX_HTTP_REQUEST_URI_TOO_LARGE); | 1301 ngx_http_finalize_request(r, NGX_HTTP_REQUEST_URI_TOO_LARGE); |
1302 break; | 1302 break; |
1468 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); | 1468 ngx_http_close_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); |
1469 break; | 1469 break; |
1470 } | 1470 } |
1471 | 1471 |
1472 if (rv == NGX_DECLINED) { | 1472 if (rv == NGX_DECLINED) { |
1473 p = r->header_name_start; | 1473 p = r->parse_start; |
1474 | 1474 |
1475 r->lingering_close = 1; | 1475 r->lingering_close = 1; |
1476 | 1476 |
1477 if (p == NULL) { | 1477 if (p == NULL) { |
1478 ngx_log_error(NGX_LOG_INFO, c->log, 0, | 1478 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
1488 len = NGX_MAX_ERROR_STR - 300; | 1488 len = NGX_MAX_ERROR_STR - 300; |
1489 } | 1489 } |
1490 | 1490 |
1491 ngx_log_error(NGX_LOG_INFO, c->log, 0, | 1491 ngx_log_error(NGX_LOG_INFO, c->log, 0, |
1492 "client sent too long header line: \"%*s...\"", | 1492 "client sent too long header line: \"%*s...\"", |
1493 len, r->header_name_start); | 1493 len, r->parse_start); |
1494 | 1494 |
1495 ngx_http_finalize_request(r, | 1495 ngx_http_finalize_request(r, |
1496 NGX_HTTP_REQUEST_HEADER_TOO_LARGE); | 1496 NGX_HTTP_REQUEST_HEADER_TOO_LARGE); |
1497 break; | 1497 break; |
1498 } | 1498 } |
1521 cscf->underscores_in_headers); | 1521 cscf->underscores_in_headers); |
1522 } | 1522 } |
1523 | 1523 |
1524 if (rc == NGX_OK) { | 1524 if (rc == NGX_OK) { |
1525 | 1525 |
1526 /* XXX */ | 1526 r->request_length += r->header_in->pos - r->parse_start; |
1527 r->request_length += r->header_in->pos - r->header_name_start; | |
1528 | 1527 |
1529 if (r->invalid_header && cscf->ignore_invalid_headers) { | 1528 if (r->invalid_header && cscf->ignore_invalid_headers) { |
1530 | 1529 |
1531 /* there was error while a header line parsing */ | 1530 /* there was error while a header line parsing */ |
1532 | 1531 |
1594 /* a whole header has been parsed successfully */ | 1593 /* a whole header has been parsed successfully */ |
1595 | 1594 |
1596 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, | 1595 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, |
1597 "http header done"); | 1596 "http header done"); |
1598 | 1597 |
1599 r->request_length += r->header_in->pos - r->header_name_start; /* XXX */ | 1598 r->request_length += r->header_in->pos - r->parse_start; |
1600 | 1599 |
1601 r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE; | 1600 r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE; |
1602 | 1601 |
1603 rc = ngx_http_process_request_header(r); | 1602 rc = ngx_http_process_request_header(r); |
1604 | 1603 |
1709 r->header_in->last = r->header_in->start; | 1708 r->header_in->last = r->header_in->start; |
1710 | 1709 |
1711 return NGX_OK; | 1710 return NGX_OK; |
1712 } | 1711 } |
1713 | 1712 |
1714 old = request_line ? r->request_start : r->header_name_start; /* XXX */ | 1713 old = r->parse_start; |
1715 | 1714 |
1716 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); | 1715 cscf = ngx_http_get_module_srv_conf(r, ngx_http_core_module); |
1717 | 1716 |
1718 if (r->state != 0 | 1717 if (r->state != 0 |
1719 && (size_t) (r->header_in->pos - old) | 1718 && (size_t) (r->header_in->pos - old) |
1780 | 1779 |
1781 ngx_memcpy(new, old, r->header_in->pos - old); | 1780 ngx_memcpy(new, old, r->header_in->pos - old); |
1782 | 1781 |
1783 b->pos = new + (r->header_in->pos - old); | 1782 b->pos = new + (r->header_in->pos - old); |
1784 b->last = new + (r->header_in->pos - old); | 1783 b->last = new + (r->header_in->pos - old); |
1784 | |
1785 r->parse_start = new; | |
1785 | 1786 |
1786 if (request_line) { | 1787 if (request_line) { |
1787 r->request_start = new; | 1788 r->request_start = new; |
1788 | 1789 |
1789 if (r->request_end) { | 1790 if (r->request_end) { |
3890 | 3891 |
3891 p = ngx_snprintf(buf, len, ", server: %V", &cscf->server_name); | 3892 p = ngx_snprintf(buf, len, ", server: %V", &cscf->server_name); |
3892 len -= p - buf; | 3893 len -= p - buf; |
3893 buf = p; | 3894 buf = p; |
3894 | 3895 |
3895 if (r->request_line.data == NULL && r->request_start) { | 3896 if (r->request_line.data == NULL && r->parse_start) { |
3896 for (p = r->request_start; p < r->header_in->last; p++) { | 3897 for (p = r->parse_start; p < r->header_in->last; p++) { |
3897 if (*p == CR || *p == LF) { | 3898 if (*p == CR || *p == LF) { |
3898 break; | 3899 break; |
3899 } | 3900 } |
3900 } | 3901 } |
3901 | 3902 |
3902 r->request_line.len = p - r->request_start; | 3903 r->request_line.len = p - r->parse_start; |
3903 r->request_line.data = r->request_start; | 3904 r->request_line.data = r->parse_start; |
3904 } | 3905 } |
3905 | 3906 |
3906 if (r->request_line.len) { | 3907 if (r->request_line.len) { |
3907 p = ngx_snprintf(buf, len, ", request: \"%V\"", &r->request_line); | 3908 p = ngx_snprintf(buf, len, ", request: \"%V\"", &r->request_line); |
3908 len -= p - buf; | 3909 len -= p - buf; |