HTTP/2: send SETTINGS ACK after applying all SETTINGS params.

This avoids sending unnecessary SETTINGS ACK in case of PROTOCOL_ERROR.

Also, it makes debug log a bit nicer to read.

Change-Id: Id5c3c6f54047eed134d0e82c693c57598731d1e0
Signed-off-by: Piotr Sikora <piotrsikora@google.com>
Reviewed-on: https://nginx-review.googlesource.com/2941
Reviewed-by: Lizan Zhou <zlizan@google.com>
diff --git a/src/http/v2/ngx_http_v2.c b/src/http/v2/ngx_http_v2.c
index d5f187b..ca52d96 100644
--- a/src/http/v2/ngx_http_v2.c
+++ b/src/http/v2/ngx_http_v2.c
@@ -1960,8 +1960,6 @@
 ngx_http_v2_state_settings(ngx_http_v2_connection_t *h2c, u_char *pos,
     u_char *end)
 {
-    ngx_http_v2_out_frame_t  *frame;
-
     if (h2c->state.flags == NGX_HTTP_V2_ACK_FLAG) {
 
         if (h2c->state.length != 0) {
@@ -1992,18 +1990,6 @@
                    "http2 SETTINGS frame params:%uz",
                    h2c->state.length / NGX_HTTP_V2_SETTINGS_PARAM_SIZE);
 
-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
-                   "http2 send SETTINGS frame ack:1");
-
-    frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_SETTINGS_ACK_SIZE,
-                                  NGX_HTTP_V2_SETTINGS_FRAME,
-                                  NGX_HTTP_V2_ACK_FLAG, 0);
-    if (frame == NULL) {
-        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
-    }
-
-    ngx_http_v2_queue_ordered_frame(h2c, frame);
-
     return ngx_http_v2_state_settings_params(h2c, pos, end);
 }
 
@@ -2012,7 +1998,8 @@
 ngx_http_v2_state_settings_params(ngx_http_v2_connection_t *h2c, u_char *pos,
     u_char *end)
 {
-    ngx_uint_t  id, value, adjustment;
+    ngx_uint_t                id, value, adjustment;
+    ngx_http_v2_out_frame_t  *frame;
 
     adjustment = 0;
 
@@ -2116,6 +2103,18 @@
         pos += NGX_HTTP_V2_SETTINGS_PARAM_SIZE;
     }
 
+    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                   "http2 send SETTINGS frame ack:1");
+
+    frame = ngx_http_v2_get_frame(h2c, NGX_HTTP_V2_SETTINGS_ACK_SIZE,
+                                  NGX_HTTP_V2_SETTINGS_FRAME,
+                                  NGX_HTTP_V2_ACK_FLAG, 0);
+    if (frame == NULL) {
+        return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_INTERNAL_ERROR);
+    }
+
+    ngx_http_v2_queue_ordered_frame(h2c, frame);
+
     if (adjustment) {
         if (ngx_http_v2_adjust_windows(h2c, adjustment) != NGX_OK) {
             return ngx_http_v2_connection_error(h2c,