aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/nginx.h4
-rw-r--r--src/http/v2/ngx_http_v2.c82
2 files changed, 30 insertions, 56 deletions
diff --git a/src/core/nginx.h b/src/core/nginx.h
index 51155410b..6b134945e 100644
--- 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
diff --git a/src/http/v2/ngx_http_v2.c b/src/http/v2/ngx_http_v2.c
index 79c4f17c2..3afa8b638 100644
--- 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_connection_t *h2c, u_char *pos,
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_http_request_t *r, u_char *pos,
/* 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,30 +4229,22 @@ ngx_http_v2_process_request_body(ngx_http_request_t *r, u_char *pos,
rb->rest = 0;
}
- if (r->request_body_no_buffering) {
+ if (size == 0) {
break;
}
+ }
- /* pass buffer to request body filter chain */
+ 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) {
- break;
- }
-
- if (size == 0) {
- break;
- }
}
- ngx_log_debug1(NGX_LOG_DEBUG_HTTP, fc->log, 0,
- "http2 request body rest %O", rb->rest);
-
if (rb->rest == 0 && rb->last_saved) {
break;
}
@@ -4287,9 +4253,8 @@ ngx_http_v2_process_request_body(ngx_http_request_t *r, u_char *pos,
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_http_request_t *r, u_char *pos,
}
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_handler(ngx_http_request_t *r)
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_http_request_t *r)
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(ngx_http_request_t *r)
return NGX_HTTP_BAD_REQUEST;
}
- rc = ngx_http_v2_filter_request_body(r);
+ rc = ngx_http_v2_process_request_body(r, NULL, 0, r->stream->in_closed, 1);
- if (rc != NGX_OK) {
+ 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(ngx_http_request_t *r)
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;