]> git.kaiwu.me - nginx.git/commitdiff
Fixed $request_length for HTTP/3.
authorRoman Arutyunyan <arut@nginx.com>
Tue, 19 May 2020 12:47:37 +0000 (15:47 +0300)
committerRoman Arutyunyan <arut@nginx.com>
Tue, 19 May 2020 12:47:37 +0000 (15:47 +0300)
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.

src/http/ngx_http_parse.c
src/http/ngx_http_request.c
src/http/ngx_http_request.h
src/http/v3/ngx_http_v3_request.c

index f665934437d6fe446272f42a39cdda14d4711ef1..b59a6ce4c90808bcb8403dd40908553a3b2582f1 100644 (file)
@@ -143,6 +143,7 @@ ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)
 
         /* HTTP methods: GET, HEAD, POST */
         case sw_start:
+            r->parse_start = p;
             r->request_start = p;
             r->method_start = p;
 
@@ -883,6 +884,7 @@ ngx_http_parse_header_line(ngx_http_request_t *r, ngx_buf_t *b,
 
         /* first char */
         case sw_start:
+            r->parse_start = p;
             r->header_name_start = p;
             r->invalid_header = 0;
 
index e3d217f799edf52c0b3fe482dba058c7ec05b5c4..baef5f44423b66eaff525e3dd8bbcc5066e27fbd 100644 (file)
@@ -1178,7 +1178,7 @@ ngx_http_process_request_line(ngx_event_t *rev)
 
             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 @@ ngx_http_process_request_line(ngx_event_t *rev)
             }
 
             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 @@ ngx_http_process_request_headers(ngx_event_t *rev)
                 }
 
                 if (rv == NGX_DECLINED) {
-                    p = r->header_name_start;
+                    p = r->parse_start;
 
                     r->lingering_close = 1;
 
@@ -1490,7 +1490,7 @@ ngx_http_process_request_headers(ngx_event_t *rev)
 
                     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 @@ ngx_http_process_request_headers(ngx_event_t *rev)
 
         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_http_process_request_headers(ngx_event_t *rev)
             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 @@ ngx_http_alloc_large_header_buffer(ngx_http_request_t *r,
         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 @@ ngx_http_alloc_large_header_buffer(ngx_http_request_t *r,
     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 @@ ngx_http_log_error_handler(ngx_http_request_t *r, ngx_http_request_t *sr,
     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) {
index 772d53b2dc111fd2380aec10864affc7a2d4cb98..1994000a486c7ccce40eeb244524a2c15cf0f4c4 100644 (file)
@@ -579,6 +579,7 @@ struct ngx_http_request_s {
      * via ngx_http_ephemeral_t
      */
 
+    u_char                           *parse_start;
     u_char                           *uri_start;
     u_char                           *uri_end;
     u_char                           *uri_ext;
index 59b8ce5b81765b56821865fb1f701a51b622cd57..432bc8711e8bde17bebe64916788f8fdda02106d 100644 (file)
@@ -59,6 +59,7 @@ ngx_http_v3_parse_request(ngx_http_request_t *r, ngx_buf_t *b)
         }
 
         r->h3_parse = st;
+        r->parse_start = b->pos;
     }
 
     while (b->pos < b->last) {
@@ -130,6 +131,7 @@ ngx_http_v3_parse_header(ngx_http_request_t *r, ngx_buf_t *b,
     st = r->h3_parse;
 
     if (st->header_rep.state == 0) {
+        r->parse_start = b->pos;
         r->invalid_header = 0;
     }