diff src/http/v3/ngx_http_v3_streams.c @ 8772:345370fdd32d quic

HTTP/3: moved parsing uni stream type to ngx_http_v3_parse.c. Previously it was parsed in ngx_http_v3_streams.c, while the streams were parsed in ngx_http_v3_parse.c. Now all parsing is done in one file. This simplifies parsing API and cleans up ngx_http_v3_streams.c.
author Roman Arutyunyan <arut@nginx.com>
date Wed, 05 May 2021 15:00:17 +0300
parents 0981329169ea
children f4d3f5d93a82
line wrap: on
line diff
--- a/src/http/v3/ngx_http_v3_streams.c
+++ b/src/http/v3/ngx_http_v3_streams.c
@@ -10,13 +10,8 @@
 #include <ngx_http.h>
 
 
-typedef ngx_int_t (*ngx_http_v3_handler_pt)(ngx_connection_t *c, void *data,
-    u_char ch);
-
-
 typedef struct {
-    ngx_http_v3_handler_pt          handler;
-    void                           *data;
+    ngx_http_v3_parse_uni_t         parse;
     ngx_int_t                       index;
 } ngx_http_v3_uni_stream_t;
 
@@ -32,7 +27,6 @@ typedef struct {
 static void ngx_http_v3_keepalive_handler(ngx_event_t *ev);
 static void ngx_http_v3_cleanup_session(void *data);
 static void ngx_http_v3_close_uni_stream(ngx_connection_t *c);
-static void ngx_http_v3_read_uni_stream_type(ngx_event_t *rev);
 static void ngx_http_v3_uni_read_handler(ngx_event_t *rev);
 static void ngx_http_v3_dummy_write_handler(ngx_event_t *wev);
 static void ngx_http_v3_push_cleanup(void *data);
@@ -131,10 +125,10 @@ ngx_http_v3_init_uni_stream(ngx_connecti
 
     c->data = us;
 
-    c->read->handler = ngx_http_v3_read_uni_stream_type;
+    c->read->handler = ngx_http_v3_uni_read_handler;
     c->write->handler = ngx_http_v3_dummy_write_handler;
 
-    ngx_http_v3_read_uni_stream_type(c->read);
+    ngx_http_v3_uni_read_handler(c->read);
 }
 
 
@@ -164,118 +158,59 @@ ngx_http_v3_close_uni_stream(ngx_connect
 }
 
 
-static void
-ngx_http_v3_read_uni_stream_type(ngx_event_t *rev)
+ngx_int_t
+ngx_http_v3_register_uni_stream(ngx_connection_t *c, uint64_t type)
 {
-    u_char                     ch;
-    ssize_t                    n;
-    ngx_int_t                  index, rc;
-    ngx_connection_t          *c;
+    ngx_int_t                  index;
     ngx_http_v3_session_t     *h3c;
     ngx_http_v3_uni_stream_t  *us;
 
-    c = rev->data;
-    us = c->data;
-    h3c = ngx_http_v3_get_session(c);
+    switch (type) {
+
+    case NGX_HTTP_V3_STREAM_ENCODER:
+
+        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
+                       "http3 encoder stream");
+        index = NGX_HTTP_V3_STREAM_CLIENT_ENCODER;
+        break;
 
-    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http3 read stream type");
+    case NGX_HTTP_V3_STREAM_DECODER:
 
-    while (rev->ready) {
+        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
+                       "http3 decoder stream");
+        index = NGX_HTTP_V3_STREAM_CLIENT_DECODER;
+        break;
 
-        n = c->recv(c, &ch, 1);
+    case NGX_HTTP_V3_STREAM_CONTROL:
 
-        if (n == NGX_AGAIN) {
-            break;
-        }
+        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
+                       "http3 control stream");
+        index = NGX_HTTP_V3_STREAM_CLIENT_CONTROL;
+
+        break;
+
+    default:
 
-        if (n == 0) {
-            rc = NGX_HTTP_V3_ERR_GENERAL_PROTOCOL_ERROR;
-            goto failed;
-        }
+        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
+                       "http3 stream 0x%02xL", type);
+        index = -1;
+    }
 
-        if (n != 1) {
-            rc = NGX_HTTP_V3_ERR_INTERNAL_ERROR;
-            goto failed;
+    if (index >= 0) {
+        h3c = ngx_http_v3_get_session(c);
+
+        if (h3c->known_streams[index]) {
+            ngx_log_error(NGX_LOG_INFO, c->log, 0, "stream exists");
+            return NGX_HTTP_V3_ERR_STREAM_CREATION_ERROR;
         }
 
-        switch (ch) {
-
-        case NGX_HTTP_V3_STREAM_ENCODER:
-
-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
-                           "http3 encoder stream");
-
-            index = NGX_HTTP_V3_STREAM_CLIENT_ENCODER;
-            us->handler = ngx_http_v3_parse_encoder;
-            n = sizeof(ngx_http_v3_parse_encoder_t);
-
-            break;
-
-        case NGX_HTTP_V3_STREAM_DECODER:
-
-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
-                           "http3 decoder stream");
-
-            index = NGX_HTTP_V3_STREAM_CLIENT_DECODER;
-            us->handler = ngx_http_v3_parse_decoder;
-            n = sizeof(ngx_http_v3_parse_decoder_t);
-
-            break;
-
-        case NGX_HTTP_V3_STREAM_CONTROL:
-
-            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,
-                           "http3 control stream");
-
-            index = NGX_HTTP_V3_STREAM_CLIENT_CONTROL;
-            us->handler = ngx_http_v3_parse_control;
-            n = sizeof(ngx_http_v3_parse_control_t);
+        h3c->known_streams[index] = c;
 
-            break;
-
-        default:
-
-            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, c->log, 0,
-                           "http3 stream 0x%02xi", (ngx_int_t) ch);
-            index = -1;
-            n = 0;
-        }
-
-        if (index >= 0) {
-            if (h3c->known_streams[index]) {
-                ngx_log_error(NGX_LOG_INFO, c->log, 0, "stream exists");
-                rc = NGX_HTTP_V3_ERR_STREAM_CREATION_ERROR;
-                goto failed;
-            }
-
-            us->index = index;
-            h3c->known_streams[index] = c;
-        }
-
-        if (n) {
-            us->data = ngx_pcalloc(c->pool, n);
-            if (us->data == NULL) {
-                rc = NGX_HTTP_V3_ERR_INTERNAL_ERROR;
-                goto failed;
-            }
-        }
-
-        rev->handler = ngx_http_v3_uni_read_handler;
-        ngx_http_v3_uni_read_handler(rev);
-        return;
+        us = c->data;
+        us->index = index;
     }
 
-    if (ngx_handle_read_event(rev, 0) != NGX_OK) {
-        rc = NGX_HTTP_V3_ERR_INTERNAL_ERROR;
-        goto failed;
-    }
-
-    return;
-
-failed:
-
-    ngx_http_v3_finalize_connection(c, rc, "could not read stream type");
-    ngx_http_v3_close_uni_stream(c);
+    return NGX_OK;
 }
 
 
@@ -317,13 +252,9 @@ ngx_http_v3_uni_read_handler(ngx_event_t
             break;
         }
 
-        if (us->handler == NULL) {
-            continue;
-        }
-
         for (i = 0; i < n; i++) {
 
-            rc = us->handler(c, us->data, buf[i]);
+            rc = ngx_http_v3_parse_uni(c, &us->parse, buf[i]);
 
             if (rc == NGX_DONE) {
                 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0,