]> git.kaiwu.me - nginx.git/commitdiff
HTTP/3: eliminated r->method_start.
authorRoman Arutyunyan <arut@nginx.com>
Wed, 25 Nov 2020 17:57:43 +0000 (17:57 +0000)
committerRoman Arutyunyan <arut@nginx.com>
Wed, 25 Nov 2020 17:57:43 +0000 (17:57 +0000)
The field was introduced to ease parsing HTTP/3 requests.

The change reduces diff to the default branch.

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 2015f56b2a1a8c96714df2222e4f367fef1b84c0..f8ec03c5011150d81e38fd2aaa71c3ef1075ec1f 100644 (file)
@@ -145,7 +145,6 @@ ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)
         case sw_start:
             r->parse_start = p;
             r->request_start = p;
-            r->method_start = p;
 
             if (ch == CR || ch == LF) {
                 break;
@@ -160,7 +159,7 @@ ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)
 
         case sw_method:
             if (ch == ' ') {
-                r->method_end = p;
+                r->method_end = p - 1;
                 m = r->request_start;
 
                 switch (p - m) {
@@ -833,10 +832,6 @@ done:
         r->request_end = p;
     }
 
-    if (r->http_protocol.data) {
-        r->http_protocol.len = r->request_end - r->http_protocol.data;
-    }
-
     r->http_version = r->http_major * 1000 + r->http_minor;
     r->state = sw_start;
 
index 3b9e590050be354adc399271e3ec4cfd72a17b4f..a60c5758f383d9fbe6c17438ebd3efecb48a6ada 100644 (file)
@@ -1162,8 +1162,12 @@ ngx_http_process_request_line(ngx_event_t *rev)
             ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
                            "http request line: \"%V\"", &r->request_line);
 
-            r->method_name.len = r->method_end - r->method_start;
-            r->method_name.data = r->method_start;
+            r->method_name.len = r->method_end - r->request_start + 1;
+            r->method_name.data = r->request_line.data;
+
+            if (r->http_protocol.data) {
+                r->http_protocol.len = r->request_end - r->http_protocol.data;
+            }
 
             if (ngx_http_process_request_uri(r) != NGX_OK) {
                 break;
index 3d33d93d494b3f7ec1742093b74279536b0b618f..9a610e8054ac31f23b4a674c8c0b4eb0bf13166d 100644 (file)
@@ -585,7 +585,6 @@ struct ngx_http_request_s {
     u_char                           *args_start;
     u_char                           *request_start;
     u_char                           *request_end;
-    u_char                           *method_start;
     u_char                           *method_end;
     u_char                           *schema_start;
     u_char                           *schema_end;
index 5511e30316224854ffa52f9cc9ada4cbc1d54ffb..2ff0440d9bbfbe8a1b613f523a09370d7e08c3d4 100644 (file)
@@ -129,11 +129,9 @@ ngx_http_v3_parse_request(ngx_http_request_t *r, ngx_buf_t *b)
             continue;
         }
 
-        ngx_str_set(&r->http_protocol, "HTTP/3.0");
-
-        len = (r->method_end - r->method_start) + 1
+        len = r->method_name.len + 1
             + (r->uri_end - r->uri_start) + 1
-            + sizeof("HTTP/3") - 1;
+            + sizeof("HTTP/3.0") - 1;
 
         p = ngx_pnalloc(c->pool, len);
         if (p == NULL) {
@@ -142,11 +140,13 @@ ngx_http_v3_parse_request(ngx_http_request_t *r, ngx_buf_t *b)
 
         r->request_start = p;
 
-        p = ngx_cpymem(p, r->method_start, r->method_end - r->method_start);
+        p = ngx_cpymem(p, r->method_name.data, r->method_name.len);
+        r->method_end = p - 1;
         *p++ = ' ';
         p = ngx_cpymem(p, r->uri_start, r->uri_end - r->uri_start);
         *p++ = ' ';
-        p = ngx_cpymem(p, "HTTP/3", sizeof("HTTP/3") - 1);
+        r->http_protocol.data = p;
+        p = ngx_cpymem(p, "HTTP/3.0", sizeof("HTTP/3.0") - 1);
 
         r->request_end = p;
         r->state = 0;
@@ -309,8 +309,7 @@ ngx_http_v3_process_pseudo_header(ngx_http_request_t *r, ngx_str_t *name,
     c = r->connection;
 
     if (name->len == 7 && ngx_strncmp(name->data, ":method", 7) == 0) {
-        r->method_start = value->data;
-        r->method_end = value->data + value->len;
+        r->method_name = *value;
 
         for (i = 0; i < sizeof(ngx_http_v3_methods)
                         / sizeof(ngx_http_v3_methods[0]); i++)