diff src/http/ngx_http_request_body.c @ 8295:5649079a41f4 quic

Parsing HTTP/3 request body.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 27 Mar 2020 19:41:06 +0300
parents 2c4dbcd6f2e4
children e5d4f057a6cb
line wrap: on
line diff
--- a/src/http/ngx_http_request_body.c
+++ b/src/http/ngx_http_request_body.c
@@ -343,11 +343,10 @@ ngx_http_do_read_client_request_body(ngx
             }
 
             if (n == 0) {
-                ngx_log_error(NGX_LOG_INFO, c->log, 0,
-                              "client prematurely closed connection");
+                rb->buf->last_buf = 1;
             }
 
-            if (n == 0 || n == NGX_ERROR) {
+            if (n == NGX_ERROR) {
                 c->error = 1;
                 return NGX_HTTP_BAD_REQUEST;
             }
@@ -355,7 +354,7 @@ ngx_http_do_read_client_request_body(ngx
             rb->buf->last += n;
             r->request_length += n;
 
-            if (n == rest) {
+            if (n == rest || n == 0) {
                 /* pass buffer to request body filter chain */
 
                 out.buf = rb->buf;
@@ -805,11 +804,7 @@ ngx_http_test_expect(ngx_http_request_t 
 
     if (r->expect_tested
         || r->headers_in.expect == NULL
-        || r->http_version < NGX_HTTP_VERSION_11
-#if (NGX_HTTP_V2)
-        || r->stream != NULL
-#endif
-       )
+        || r->http_version != NGX_HTTP_VERSION_11)
     {
         return NGX_OK;
     }
@@ -914,6 +909,11 @@ ngx_http_request_body_length_filter(ngx_
             b->last_buf = 1;
         }
 
+        if (cl->buf->last_buf && rb->rest > 0) {
+            /* XXX client prematurely closed connection */
+            return NGX_ERROR;
+        }
+
         *ll = tl;
         ll = &tl->next;
     }
@@ -950,7 +950,16 @@ ngx_http_request_body_chunked_filter(ngx
         }
 
         r->headers_in.content_length_n = 0;
-        rb->rest = 3;
+
+#if (NGX_HTTP_V3)
+        if (r->http_version == NGX_HTTP_VERSION_30) {
+            rb->rest = 1;
+
+        } else
+#endif
+        {
+            rb->rest = 3;
+        }
     }
 
     out = NULL;