changeset 8843:4ca8035c19a4 quic

Merged with the default branch.
author Sergey Kandaurov <pluknet@nginx.com>
date Wed, 08 Sep 2021 15:53:00 +0300
parents 486c6a9be111 (current diff) a525013b8296 (diff)
children 062080651d50
files
diffstat 4 files changed, 62 insertions(+), 60 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags
+++ b/.hgtags
@@ -463,3 +463,4 @@ ffcbb9980ee2bad27b4d7b1cd680b14ff47b29aa
 df34dcc9ac072ffd0945e5a1f3eb7987e8275375 release-1.21.0
 a68ac0677f8553b1f84d357bc9da114731ab5f47 release-1.21.1
 bfbc52374adcbf2f9060afd62de940f6fab3bba5 release-1.21.2
+2217a9c1d0b86026f22700b3c089545db1964f55 release-1.21.3
--- a/docs/xml/nginx/changes.xml
+++ b/docs/xml/nginx/changes.xml
@@ -5,6 +5,33 @@
 <change_log title="nginx">
 
 
+<changes ver="1.21.3" date="2021-09-07">
+
+<change type="change">
+<para lang="ru">
+оптимизация чтения тела запроса
+при использовании HTTP/2.
+</para>
+<para lang="en">
+optimization of client request body reading
+when using HTTP/2.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+во внутреннем API для обработки тела запроса
+при использовании HTTP/2 и буферизации обрабатываемых данных.
+</para>
+<para lang="en">
+in request body filters internal API
+when using HTTP/2 and buffering of the data being processed.
+</para>
+</change>
+
+</changes>
+
+
 <changes ver="1.21.2" date="2021-08-31">
 
 <change type="change">
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -9,8 +9,8 @@
 #define _NGINX_H_INCLUDED_
 
 
-#define nginx_version      1021002
-#define NGINX_VERSION      "1.21.2"
+#define nginx_version      1021003
+#define NGINX_VERSION      "1.21.3"
 #define NGINX_VER          "nginx/" NGINX_VERSION
 
 #ifdef NGX_BUILD
--- a/src/http/v2/ngx_http_v2.c
+++ b/src/http/v2/ngx_http_v2.c
@@ -1092,7 +1092,7 @@ static u_char *
 ngx_http_v2_state_read_data(ngx_http_v2_connection_t *h2c, u_char *pos,
     u_char *end)
 {
-    size_t                   size, window;
+    size_t                   size;
     ngx_buf_t               *buf;
     ngx_int_t                rc;
     ngx_connection_t        *fc;
@@ -1148,32 +1148,6 @@ ngx_http_v2_state_read_data(ngx_http_v2_
             ngx_http_finalize_request(r, rc);
         }
 
-        if (rc == NGX_AGAIN && !stream->no_flow_control) {
-            buf = r->request_body->buf;
-            window = buf->end - buf->last;
-
-            window -= h2c->state.length - size;
-
-            if (window < stream->recv_window) {
-                ngx_log_error(NGX_LOG_ALERT, h2c->connection->log, 0,
-                              "http2 negative window update");
-                return ngx_http_v2_connection_error(h2c,
-                                                    NGX_HTTP_V2_INTERNAL_ERROR);
-            }
-
-            if (window > stream->recv_window) {
-                if (ngx_http_v2_send_window_update(h2c, stream->node->id,
-                                                   window - stream->recv_window)
-                    == NGX_ERROR)
-                {
-                    return ngx_http_v2_connection_error(h2c,
-                                                    NGX_HTTP_V2_INTERNAL_ERROR);
-                }
-
-                stream->recv_window = window;
-            }
-        }
-
         ngx_http_run_posted_requests(fc);
 
     } else if (size) {
@@ -4214,8 +4188,8 @@ ngx_http_v2_process_request_body(ngx_htt
 
                 /* update chains */
 
-                ngx_log_error(NGX_LOG_DEBUG, fc->log, 0,
-                              "http2 body update chains");
+                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0,
+                               "http2 body update chains");
 
                 rc = ngx_http_v2_filter_request_body(r);
 
@@ -4255,22 +4229,6 @@ ngx_http_v2_process_request_body(ngx_htt
                 rb->rest = 0;
             }
 
-            if (r->request_body_no_buffering) {
-                break;
-            }
-
-            /* pass buffer to request body filter chain */
-
-            rc = ngx_http_v2_filter_request_body(r);
-
-            if (rc != NGX_OK) {
-                return rc;
-            }
-
-            if (rb->rest == 0) {
-                break;
-            }
-
             if (size == 0) {
                 break;
             }
@@ -4279,6 +4237,14 @@ ngx_http_v2_process_request_body(ngx_htt
         ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0,
                        "http2 request body rest %O", rb->rest);
 
+        if (flush) {
+            rc = ngx_http_v2_filter_request_body(r);
+
+            if (rc != NGX_OK) {
+                return rc;
+            }
+        }
+
         if (rb->rest == 0 && rb->last_saved) {
             break;
         }
@@ -4287,9 +4253,8 @@ ngx_http_v2_process_request_body(ngx_htt
             clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
             ngx_add_timer(fc->read, clcf->client_body_timeout);
 
-            if (r->request_body_no_buffering) {
+            if (!flush) {
                 ngx_post_event(fc->read, &ngx_posted_events);
-                return NGX_AGAIN;
             }
 
             return NGX_AGAIN;
@@ -4301,7 +4266,10 @@ ngx_http_v2_process_request_body(ngx_htt
     }
 
     if (r->request_body_no_buffering) {
-        ngx_post_event(fc->read, &ngx_posted_events);
+        if (!flush) {
+            ngx_post_event(fc->read, &ngx_posted_events);
+        }
+
         return NGX_OK;
     }
 
@@ -4455,14 +4423,26 @@ ngx_http_v2_read_client_request_body_han
         return;
     }
 
+    if (r->stream->no_flow_control) {
+        return;
+    }
+
     if (r->request_body->rest == 0) {
         return;
     }
 
+    if (r->request_body->busy != NULL) {
+        return;
+    }
+
     stream = r->stream;
     h2c = stream->connection;
 
     buf = r->request_body->buf;
+
+    buf->pos = buf->start;
+    buf->last = buf->start;
+
     window = buf->end - buf->start;
 
     if (h2c->state.stream == stream) {
@@ -4511,7 +4491,6 @@ ngx_http_v2_read_unbuffered_request_body
     ngx_connection_t          *fc;
     ngx_http_v2_stream_t      *stream;
     ngx_http_v2_connection_t  *h2c;
-    ngx_http_core_loc_conf_t  *clcf;
 
     stream = r->stream;
     fc = r->connection;
@@ -4535,14 +4514,14 @@ ngx_http_v2_read_unbuffered_request_body
         return NGX_HTTP_BAD_REQUEST;
     }
 
-    rc = ngx_http_v2_filter_request_body(r);
-
-    if (rc != NGX_OK) {
+    rc = ngx_http_v2_process_request_body(r, NULL, 0, r->stream->in_closed, 1);
+
+    if (rc != NGX_OK && rc != NGX_AGAIN) {
         stream->skip_data = 1;
         return rc;
     }
 
-    if (r->request_body->rest == 0 && r->request_body->last_saved) {
+    if (rc == NGX_OK) {
         return NGX_OK;
     }
 
@@ -4590,11 +4569,6 @@ ngx_http_v2_read_unbuffered_request_body
         return NGX_HTTP_INTERNAL_SERVER_ERROR;
     }
 
-    if (stream->recv_window == 0) {
-        clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
-        ngx_add_timer(fc->read, clcf->client_body_timeout);
-    }
-
     stream->recv_window = window;
 
     return NGX_AGAIN;