diff src/event/ngx_event_quic.c @ 8215:38c0898b6df7 quic

HTTP/3.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 13 Mar 2020 19:36:33 +0300
parents 6fd2cce50fe2
children 0aec63f50c29
line wrap: on
line diff
--- a/src/event/ngx_event_quic.c
+++ b/src/event/ngx_event_quic.c
@@ -1909,6 +1909,7 @@ ngx_quic_stream_recv(ngx_connection_t *c
     b = sn->b;
 
     if (b->last - b->pos == 0) {
+        c->read->ready = 0;
         ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
                        "quic recv() not ready");
         return NGX_AGAIN; // ?
@@ -2029,6 +2030,7 @@ ngx_quic_payload_handler(ngx_connection_
     u_char                  *end, *p;
     ssize_t                  len;
     ngx_buf_t               *b;
+    ngx_log_t               *log;
     ngx_uint_t               ack_this;
     ngx_pool_t              *pool;
     ngx_event_t             *rev, *wev;
@@ -2129,21 +2131,38 @@ ngx_quic_payload_handler(ngx_connection_
                     return NGX_ERROR;
                 }
 
-                pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log);
-                if (pool == NULL) {
-                    return NGX_ERROR;
-                }
-
                 sn->c = ngx_get_connection(-1, c->log); // TODO: free on connection termination
                 if (sn->c == NULL) {
                     return NGX_ERROR;
                 }
 
+                pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, c->log);
+                if (pool == NULL) {
+                    /* XXX free connection */
+                    return NGX_ERROR;
+                }
+
+                log = ngx_palloc(pool, sizeof(ngx_log_t));
+                if (log == NULL) {
+                    /* XXX free pool and connection */
+                    return NGX_ERROR;
+                }
+
+                *log = *c->log;
+                pool->log = log;
+
+                sn->c->log = log;
                 sn->c->pool = pool;
 
+                sn->c->listening = c->listening;
+                sn->c->sockaddr = c->sockaddr;
+                sn->c->local_sockaddr = c->local_sockaddr;
+
                 rev = sn->c->read;
                 wev = sn->c->write;
 
+                rev->ready = 1;
+
                 rev->log = c->log;
                 wev->log = c->log;