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;