diff src/http/v3/ngx_http_v3.h @ 8456:c9538aef3211 quic

HTTP/3: refactored dynamic table implementation. Previously dynamic table was not functional because of zero limit on its size set by default. Now the following changes enable it: - new directives to set SETTINGS_QPACK_MAX_TABLE_CAPACITY and SETTINGS_QPACK_BLOCKED_STREAMS - send settings with SETTINGS_QPACK_MAX_TABLE_CAPACITY and SETTINGS_QPACK_BLOCKED_STREAMS to the client - send Insert Count Increment to the client - send Header Acknowledgement to the client - evict old dynamic table entries on overflow - decode Required Insert Count from client - block stream if Required Insert Count is not reached
author Roman Arutyunyan <arut@nginx.com>
date Thu, 02 Jul 2020 15:34:05 +0300
parents 032cb35ce758
children 1ed698947172
line wrap: on
line diff
--- a/src/http/v3/ngx_http_v3.h
+++ b/src/http/v3/ngx_http_v3.h
@@ -48,20 +48,8 @@
 #define NGX_HTTP_V3_MAX_KNOWN_STREAM               6
 
 #define NGX_HTTP_V3_DEFAULT_MAX_FIELD_SIZE         4096
-
-
-typedef struct {
-    ngx_quic_tp_t           quic;
-    size_t                  max_field_size;
-} ngx_http_v3_srv_conf_t;
-
-
-typedef struct {
-    ngx_http_connection_t   hc;
-
-    ngx_array_t            *dynamic;
-    ngx_connection_t       *known_streams[NGX_HTTP_V3_MAX_KNOWN_STREAM];
-} ngx_http_v3_connection_t;
+#define NGX_HTTP_V3_DEFAULT_MAX_TABLE_CAPACITY     16384
+#define NGX_HTTP_V3_DEFAULT_MAX_BLOCKED_STREAMS    16
 
 
 #define ngx_http_v3_get_module_srv_conf(c, module)                            \
@@ -71,11 +59,39 @@ typedef struct {
 
 
 typedef struct {
-    ngx_str_t               name;
-    ngx_str_t               value;
+    ngx_quic_tp_t                 quic;
+    size_t                        max_field_size;
+    size_t                        max_table_capacity;
+    ngx_uint_t                    max_blocked_streams;
+} ngx_http_v3_srv_conf_t;
+
+
+typedef struct {
+    ngx_str_t                     name;
+    ngx_str_t                     value;
 } ngx_http_v3_header_t;
 
 
+typedef struct {
+    ngx_http_v3_header_t        **elts;
+    ngx_uint_t                    nelts;
+    ngx_uint_t                    base;
+    size_t                        size;
+    size_t                        capacity;
+} ngx_http_v3_dynamic_table_t;
+
+
+typedef struct {
+    ngx_http_connection_t         hc;
+    ngx_http_v3_dynamic_table_t   table;
+    ngx_queue_t                   blocked;
+    ngx_uint_t                    nblocked;
+    ngx_uint_t                    settings_sent;
+                                               /* unsigned  settings_sent:1; */
+    ngx_connection_t             *known_streams[NGX_HTTP_V3_MAX_KNOWN_STREAM];
+} ngx_http_v3_connection_t;
+
+
 ngx_int_t ngx_http_v3_parse_request(ngx_http_request_t *r, ngx_buf_t *b);
 ngx_int_t ngx_http_v3_parse_header(ngx_http_request_t *r, ngx_buf_t *b,
     ngx_uint_t allow_underscores);
@@ -88,6 +104,7 @@ uintptr_t ngx_http_v3_encode_varlen_int(
 uintptr_t ngx_http_v3_encode_prefix_int(u_char *p, uint64_t value,
     ngx_uint_t prefix);
 
+ngx_int_t ngx_http_v3_send_settings(ngx_connection_t *c);
 void ngx_http_v3_handle_client_uni_stream(ngx_connection_t *c);
 
 ngx_int_t ngx_http_v3_ref_insert(ngx_connection_t *c, ngx_uint_t dynamic,
@@ -99,8 +116,12 @@ ngx_int_t ngx_http_v3_duplicate(ngx_conn
 ngx_int_t ngx_http_v3_ack_header(ngx_connection_t *c, ngx_uint_t stream_id);
 ngx_int_t ngx_http_v3_cancel_stream(ngx_connection_t *c, ngx_uint_t stream_id);
 ngx_int_t ngx_http_v3_inc_insert_count(ngx_connection_t *c, ngx_uint_t inc);
-ngx_http_v3_header_t *ngx_http_v3_lookup_table(ngx_connection_t *c,
-    ngx_uint_t dynamic, ngx_uint_t index);
+ngx_int_t ngx_http_v3_lookup_static(ngx_connection_t *c, ngx_uint_t index,
+    ngx_str_t *name, ngx_str_t *value);
+ngx_int_t ngx_http_v3_lookup(ngx_connection_t *c, ngx_uint_t index,
+    ngx_str_t *name, ngx_str_t *value);
+ngx_int_t ngx_http_v3_decode_insert_count(ngx_connection_t *c,
+    ngx_uint_t *insert_count);
 ngx_int_t ngx_http_v3_check_insert_count(ngx_connection_t *c,
     ngx_uint_t insert_count);
 ngx_int_t ngx_http_v3_set_param(ngx_connection_t *c, uint64_t id,