aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Sikora <piotrsikora@google.com>2017-06-02 15:05:32 +0300
committerPiotr Sikora <piotrsikora@google.com>2017-06-02 15:05:32 +0300
commit51a4a414ca051c779ac90a566bd50c0a1ecd6a40 (patch)
treee59c6d2d8bed9e8486e5f58bc64970477b0942ee
parentca53600ac01de47e1f11d2176310cdf6621a67fa (diff)
downloadnginx-51a4a414ca051c779ac90a566bd50c0a1ecd6a40.tar.gz
nginx-51a4a414ca051c779ac90a566bd50c0a1ecd6a40.zip
HTTP/2: don't send SETTINGS ACK before already queued DATA frames.
Previously, SETTINGS ACK was sent immediately upon receipt of SETTINGS frame, before already queued DATA frames created using old SETTINGS. This incorrect behavior was source of interoperability issues, because peers rely on the fact that new SETTINGS are in effect after receiving SETTINGS ACK. Reported by Feng Li. Signed-off-by: Piotr Sikora <piotrsikora@google.com>
-rw-r--r--src/http/v2/ngx_http_v2.c2
-rw-r--r--src/http/v2/ngx_http_v2.h9
2 files changed, 10 insertions, 1 deletions
diff --git a/src/http/v2/ngx_http_v2.c b/src/http/v2/ngx_http_v2.c
index d4ee8cc24..8e1b7aed4 100644
--- a/src/http/v2/ngx_http_v2.c
+++ b/src/http/v2/ngx_http_v2.c
@@ -2032,7 +2032,7 @@ ngx_http_v2_state_settings_params(ngx_http_v2_connection_t *h2c, u_char *pos,
return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
}
- ngx_http_v2_queue_blocked_frame(h2c, frame);
+ ngx_http_v2_queue_ordered_frame(h2c, frame);
if (window_delta) {
if (ngx_http_v2_adjust_windows(h2c, window_delta) != NGX_OK) {
diff --git a/src/http/v2/ngx_http_v2.h b/src/http/v2/ngx_http_v2.h
index be34a0933..4804658eb 100644
--- a/src/http/v2/ngx_http_v2.h
+++ b/src/http/v2/ngx_http_v2.h
@@ -261,6 +261,15 @@ ngx_http_v2_queue_blocked_frame(ngx_http_v2_connection_t *h2c,
}
+static ngx_inline void
+ngx_http_v2_queue_ordered_frame(ngx_http_v2_connection_t *h2c,
+ ngx_http_v2_out_frame_t *frame)
+{
+ frame->next = h2c->last_out;
+ h2c->last_out = frame;
+}
+
+
void ngx_http_v2_init(ngx_event_t *rev);
void ngx_http_v2_request_headers_init(void);