[nginx] HTTP/2: more style, comments, and debugging.

Ruslan Ermilov ru at nginx.com
Tue Jan 30 12:26:28 UTC 2018


details:   http://hg.nginx.org/nginx/rev/61d276dcd493
branches:  
changeset: 7191:61d276dcd493
user:      Ruslan Ermilov <ru at nginx.com>
date:      Mon Jan 29 16:06:33 2018 +0300
description:
HTTP/2: more style, comments, and debugging.

diffstat:

 src/http/v2/ngx_http_v2.c               |   33 ++-
 src/http/v2/ngx_http_v2.h               |    3 +-
 src/http/v2/ngx_http_v2_filter_module.c |  290 ++++++++++++++++---------------
 3 files changed, 168 insertions(+), 158 deletions(-)

diffs (452 lines):

diff -r e11a0679d349 -r 61d276dcd493 src/http/v2/ngx_http_v2.c
--- a/src/http/v2/ngx_http_v2.c	Mon Jan 29 15:54:36 2018 +0300
+++ b/src/http/v2/ngx_http_v2.c	Mon Jan 29 16:06:33 2018 +0300
@@ -185,16 +185,16 @@ static void ngx_http_v2_pool_cleanup(voi
 
 
 static ngx_http_v2_handler_pt ngx_http_v2_frame_states[] = {
-    ngx_http_v2_state_data,
-    ngx_http_v2_state_headers,
-    ngx_http_v2_state_priority,
-    ngx_http_v2_state_rst_stream,
-    ngx_http_v2_state_settings,
-    ngx_http_v2_state_push_promise,
-    ngx_http_v2_state_ping,
-    ngx_http_v2_state_goaway,
-    ngx_http_v2_state_window_update,
-    ngx_http_v2_state_continuation
+    ngx_http_v2_state_data,               /* NGX_HTTP_V2_DATA_FRAME */
+    ngx_http_v2_state_headers,            /* NGX_HTTP_V2_HEADERS_FRAME */
+    ngx_http_v2_state_priority,           /* NGX_HTTP_V2_PRIORITY_FRAME */
+    ngx_http_v2_state_rst_stream,         /* NGX_HTTP_V2_RST_STREAM_FRAME */
+    ngx_http_v2_state_settings,           /* NGX_HTTP_V2_SETTINGS_FRAME */
+    ngx_http_v2_state_push_promise,       /* NGX_HTTP_V2_PUSH_PROMISE_FRAME */
+    ngx_http_v2_state_ping,               /* NGX_HTTP_V2_PING_FRAME */
+    ngx_http_v2_state_goaway,             /* NGX_HTTP_V2_GOAWAY_FRAME */
+    ngx_http_v2_state_window_update,      /* NGX_HTTP_V2_WINDOW_UPDATE_FRAME */
+    ngx_http_v2_state_continuation        /* NGX_HTTP_V2_CONTINUATION_FRAME */
 };
 
 #define NGX_HTTP_V2_FRAME_STATES                                              \
@@ -1046,7 +1046,7 @@ ngx_http_v2_state_headers(ngx_http_v2_co
 
     depend = 0;
     excl = 0;
-    weight = 16;
+    weight = NGX_HTTP_V2_DEFAULT_WEIGHT;
 
     if (priority) {
         dependency = ngx_http_v2_parse_uint32(pos);
@@ -1059,7 +1059,8 @@ ngx_http_v2_state_headers(ngx_http_v2_co
     }
 
     ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
-                   "http2 HEADERS frame sid:%ui on %ui excl:%ui weight:%ui",
+                   "http2 HEADERS frame sid:%ui "
+                   "depends on %ui excl:%ui weight:%ui",
                    h2c->state.sid, depend, excl, weight);
 
     if (h2c->state.sid % 2 == 0 || h2c->state.sid <= h2c->last_sid) {
@@ -1788,7 +1789,8 @@ ngx_http_v2_state_priority(ngx_http_v2_c
     pos += NGX_HTTP_V2_PRIORITY_SIZE;
 
     ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
-                   "http2 PRIORITY frame sid:%ui on %ui excl:%ui weight:%ui",
+                   "http2 PRIORITY frame sid:%ui "
+                   "depends on %ui excl:%ui weight:%ui",
                    h2c->state.sid, depend, excl, weight);
 
     if (h2c->state.sid == 0) {
@@ -1986,6 +1988,9 @@ ngx_http_v2_state_settings_params(ngx_ht
         id = ngx_http_v2_parse_uint16(pos);
         value = ngx_http_v2_parse_uint32(&pos[2]);
 
+        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
+                       "http2 setting %ui:%ui", id, value);
+
         switch (id) {
 
         case NGX_HTTP_V2_INIT_WINDOW_SIZE_SETTING:
@@ -3343,7 +3348,7 @@ ngx_http_v2_construct_request_line(ngx_h
 
         } else if (r->schema_start == NULL) {
             ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
-                          "client sent no :schema header");
+                          "client sent no :scheme header");
 
         } else {
             ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
diff -r e11a0679d349 -r 61d276dcd493 src/http/v2/ngx_http_v2.h
--- a/src/http/v2/ngx_http_v2.h	Mon Jan 29 15:54:36 2018 +0300
+++ b/src/http/v2/ngx_http_v2.h	Mon Jan 29 16:06:33 2018 +0300
@@ -49,6 +49,8 @@
 #define NGX_HTTP_V2_MAX_WINDOW           ((1U << 31) - 1)
 #define NGX_HTTP_V2_DEFAULT_WINDOW       65535
 
+#define NGX_HTTP_V2_DEFAULT_WEIGHT       16
+
 
 typedef struct ngx_http_v2_connection_s   ngx_http_v2_connection_t;
 typedef struct ngx_http_v2_node_s         ngx_http_v2_node_t;
@@ -272,7 +274,6 @@ ngx_http_v2_queue_ordered_frame(ngx_http
 
 
 void ngx_http_v2_init(ngx_event_t *rev);
-void ngx_http_v2_request_headers_init(void);
 
 ngx_int_t ngx_http_v2_read_request_body(ngx_http_request_t *r);
 ngx_int_t ngx_http_v2_read_unbuffered_request_body(ngx_http_request_t *r);
diff -r e11a0679d349 -r 61d276dcd493 src/http/v2/ngx_http_v2_filter_module.c
--- a/src/http/v2/ngx_http_v2_filter_module.c	Mon Jan 29 15:54:36 2018 +0300
+++ b/src/http/v2/ngx_http_v2_filter_module.c	Mon Jan 29 16:06:33 2018 +0300
@@ -138,6 +138,7 @@ ngx_http_v2_header_filter(ngx_http_reque
     ngx_table_elt_t           *header;
     ngx_connection_t          *fc;
     ngx_http_cleanup_t        *cln;
+    ngx_http_v2_stream_t      *stream;
     ngx_http_v2_out_frame_t   *frame;
     ngx_http_v2_connection_t  *h2c;
     ngx_http_core_loc_conf_t  *clcf;
@@ -157,7 +158,9 @@ ngx_http_v2_header_filter(ngx_http_reque
                                   ngx_http_v2_literal_size(NGINX_VER_BUILD);
     static u_char nginx_ver_build[ngx_http_v2_literal_size(NGINX_VER_BUILD)];
 
-    if (!r->stream) {
+    stream = r->stream;
+
+    if (!stream) {
         return ngx_http_next_header_filter(r);
     }
 
@@ -236,7 +239,7 @@ ngx_http_v2_header_filter(ngx_http_reque
         }
     }
 
-    h2c = r->stream->connection;
+    h2c = stream->connection;
 
     len = h2c->table_update ? 1 : 0;
 
@@ -633,9 +636,9 @@ ngx_http_v2_header_filter(ngx_http_reque
         return NGX_ERROR;
     }
 
-    ngx_http_v2_queue_blocked_frame(r->stream->connection, frame);
+    ngx_http_v2_queue_blocked_frame(h2c, frame);
 
-    r->stream->queued = 1;
+    stream->queued = 1;
 
     cln = ngx_http_cleanup_add(r, 0);
     if (cln == NULL) {
@@ -643,124 +646,12 @@ ngx_http_v2_header_filter(ngx_http_reque
     }
 
     cln->handler = ngx_http_v2_filter_cleanup;
-    cln->data = r->stream;
+    cln->data = stream;
 
     fc->send_chain = ngx_http_v2_send_chain;
     fc->need_last_buf = 1;
 
-    return ngx_http_v2_filter_send(fc, r->stream);
-}
-
-
-static ngx_http_v2_out_frame_t *
-ngx_http_v2_create_trailers_frame(ngx_http_request_t *r)
-{
-    u_char           *pos, *start, *tmp;
-    size_t            len, tmp_len;
-    ngx_uint_t        i;
-    ngx_list_part_t  *part;
-    ngx_table_elt_t  *header;
-
-    len = 0;
-    tmp_len = 0;
-
-    part = &r->headers_out.trailers.part;
-    header = part->elts;
-
-    for (i = 0; /* void */; i++) {
-
-        if (i >= part->nelts) {
-            if (part->next == NULL) {
-                break;
-            }
-
-            part = part->next;
-            header = part->elts;
-            i = 0;
-        }
-
-        if (header[i].hash == 0) {
-            continue;
-        }
-
-        if (header[i].key.len > NGX_HTTP_V2_MAX_FIELD) {
-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
-                          "too long response trailer name: \"%V\"",
-                          &header[i].key);
-            return NULL;
-        }
-
-        if (header[i].value.len > NGX_HTTP_V2_MAX_FIELD) {
-            ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
-                          "too long response trailer value: \"%V: %V\"",
-                          &header[i].key, &header[i].value);
-            return NULL;
-        }
-
-        len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len
-                 + NGX_HTTP_V2_INT_OCTETS + header[i].value.len;
-
-        if (header[i].key.len > tmp_len) {
-            tmp_len = header[i].key.len;
-        }
-
-        if (header[i].value.len > tmp_len) {
-            tmp_len = header[i].value.len;
-        }
-    }
-
-    if (len == 0) {
-        return NGX_HTTP_V2_NO_TRAILERS;
-    }
-
-    tmp = ngx_palloc(r->pool, tmp_len);
-    pos = ngx_pnalloc(r->pool, len);
-
-    if (pos == NULL || tmp == NULL) {
-        return NULL;
-    }
-
-    start = pos;
-
-    part = &r->headers_out.trailers.part;
-    header = part->elts;
-
-    for (i = 0; /* void */; i++) {
-
-        if (i >= part->nelts) {
-            if (part->next == NULL) {
-                break;
-            }
-
-            part = part->next;
-            header = part->elts;
-            i = 0;
-        }
-
-        if (header[i].hash == 0) {
-            continue;
-        }
-
-#if (NGX_DEBUG)
-        if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
-            ngx_strlow(tmp, header[i].key.data, header[i].key.len);
-
-            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                           "http2 output trailer: \"%*s: %V\"",
-                           header[i].key.len, tmp, &header[i].value);
-        }
-#endif
-
-        *pos++ = 0;
-
-        pos = ngx_http_v2_write_name(pos, header[i].key.data,
-                                     header[i].key.len, tmp);
-
-        pos = ngx_http_v2_write_value(pos, header[i].value.data,
-                                      header[i].value.len, tmp);
-    }
-
-    return ngx_http_v2_create_headers_frame(r, start, pos, 1);
+    return ngx_http_v2_filter_send(fc, stream);
 }
 
 
@@ -917,6 +808,120 @@ ngx_http_v2_create_headers_frame(ngx_htt
 }
 
 
+static ngx_http_v2_out_frame_t *
+ngx_http_v2_create_trailers_frame(ngx_http_request_t *r)
+{
+    u_char            *pos, *start, *tmp;
+    size_t             len, tmp_len;
+    ngx_uint_t         i;
+    ngx_list_part_t   *part;
+    ngx_table_elt_t   *header;
+    ngx_connection_t  *fc;
+
+    fc = r->connection;
+    len = 0;
+    tmp_len = 0;
+
+    part = &r->headers_out.trailers.part;
+    header = part->elts;
+
+    for (i = 0; /* void */; i++) {
+
+        if (i >= part->nelts) {
+            if (part->next == NULL) {
+                break;
+            }
+
+            part = part->next;
+            header = part->elts;
+            i = 0;
+        }
+
+        if (header[i].hash == 0) {
+            continue;
+        }
+
+        if (header[i].key.len > NGX_HTTP_V2_MAX_FIELD) {
+            ngx_log_error(NGX_LOG_CRIT, fc->log, 0,
+                          "too long response trailer name: \"%V\"",
+                          &header[i].key);
+            return NULL;
+        }
+
+        if (header[i].value.len > NGX_HTTP_V2_MAX_FIELD) {
+            ngx_log_error(NGX_LOG_CRIT, fc->log, 0,
+                          "too long response trailer value: \"%V: %V\"",
+                          &header[i].key, &header[i].value);
+            return NULL;
+        }
+
+        len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len
+                 + NGX_HTTP_V2_INT_OCTETS + header[i].value.len;
+
+        if (header[i].key.len > tmp_len) {
+            tmp_len = header[i].key.len;
+        }
+
+        if (header[i].value.len > tmp_len) {
+            tmp_len = header[i].value.len;
+        }
+    }
+
+    if (len == 0) {
+        return NGX_HTTP_V2_NO_TRAILERS;
+    }
+
+    tmp = ngx_palloc(r->pool, tmp_len);
+    pos = ngx_pnalloc(r->pool, len);
+
+    if (pos == NULL || tmp == NULL) {
+        return NULL;
+    }
+
+    start = pos;
+
+    part = &r->headers_out.trailers.part;
+    header = part->elts;
+
+    for (i = 0; /* void */; i++) {
+
+        if (i >= part->nelts) {
+            if (part->next == NULL) {
+                break;
+            }
+
+            part = part->next;
+            header = part->elts;
+            i = 0;
+        }
+
+        if (header[i].hash == 0) {
+            continue;
+        }
+
+#if (NGX_DEBUG)
+        if (fc->log->log_level & NGX_LOG_DEBUG_HTTP) {
+            ngx_strlow(tmp, header[i].key.data, header[i].key.len);
+
+            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, fc->log, 0,
+                           "http2 output trailer: \"%*s: %V\"",
+                           header[i].key.len, tmp, &header[i].value);
+        }
+#endif
+
+        *pos++ = 0;
+
+        pos = ngx_http_v2_write_name(pos, header[i].key.data,
+                                     header[i].key.len, tmp);
+
+        pos = ngx_http_v2_write_value(pos, header[i].value.data,
+                                      header[i].value.len, tmp);
+    }
+
+    return ngx_http_v2_create_headers_frame(r, start, pos, 1);
+}
+
+
 static ngx_chain_t *
 ngx_http_v2_send_chain(ngx_connection_t *fc, ngx_chain_t *in, off_t limit)
 {
@@ -1240,31 +1245,6 @@ ngx_http_v2_filter_get_data_frame(ngx_ht
 
 
 static ngx_inline ngx_int_t
-ngx_http_v2_filter_send(ngx_connection_t *fc, ngx_http_v2_stream_t *stream)
-{
-    stream->blocked = 1;
-
-    if (ngx_http_v2_send_output_queue(stream->connection) == NGX_ERROR) {
-        fc->error = 1;
-        return NGX_ERROR;
-    }
-
-    stream->blocked = 0;
-
-    if (stream->queued) {
-        fc->buffered |= NGX_HTTP_V2_BUFFERED;
-        fc->write->active = 1;
-        fc->write->ready = 0;
-        return NGX_AGAIN;
-    }
-
-    fc->buffered &= ~NGX_HTTP_V2_BUFFERED;
-
-    return NGX_OK;
-}
-
-
-static ngx_inline ngx_int_t
 ngx_http_v2_flow_control(ngx_http_v2_connection_t *h2c,
     ngx_http_v2_stream_t *stream)
 {
@@ -1317,6 +1297,30 @@ ngx_http_v2_waiting_queue(ngx_http_v2_co
 }
 
 
+static ngx_inline ngx_int_t
+ngx_http_v2_filter_send(ngx_connection_t *fc, ngx_http_v2_stream_t *stream)
+{
+    stream->blocked = 1;
+
+    if (ngx_http_v2_send_output_queue(stream->connection) == NGX_ERROR) {
+        fc->error = 1;
+        return NGX_ERROR;
+    }
+
+    stream->blocked = 0;
+
+    if (stream->queued) {
+        fc->buffered |= NGX_HTTP_V2_BUFFERED;
+        fc->write->active = 1;
+        fc->write->ready = 0;
+        return NGX_AGAIN;
+    }
+
+    fc->buffered &= ~NGX_HTTP_V2_BUFFERED;
+
+    return NGX_OK;
+}
+
 
 static ngx_int_t
 ngx_http_v2_headers_frame_handler(ngx_http_v2_connection_t *h2c,


More information about the nginx-devel mailing list