]> git.kaiwu.me - nginx.git/commitdiff
HTTP UDP layer, QUIC support autotest.
authorSergey Kandaurov <pluknet@nginx.com>
Fri, 28 Feb 2020 10:09:51 +0000 (13:09 +0300)
committerSergey Kandaurov <pluknet@nginx.com>
Fri, 28 Feb 2020 10:09:51 +0000 (13:09 +0300)
auto/lib/openssl/conf
src/http/ngx_http.c
src/http/ngx_http_core_module.c
src/http/ngx_http_core_module.h
src/http/ngx_http_request.c

index 4fb52df7fe17049883f903b1e6f099c486ca5b77..4f4390e11547228effd8375f406e0f4be2dde26a 100644 (file)
@@ -140,3 +140,12 @@ END
     fi
 
 fi
+
+ngx_feature="OpenSSL QUIC support"
+ngx_feature_name="NGX_OPENSSL_QUIC"
+ngx_feature_run=no
+ngx_feature_incs="#include <openssl/ssl.h>"
+ngx_feature_path=
+ngx_feature_libs="-lssl -lcrypto $NGX_LIBDL"
+ngx_feature_test="SSL_CTX_set_quic_method(NULL, NULL)"
+. auto/feature
index 79ef9c644c83a7cd05eb07442994cfe9d48a669d..3e82dc60dea7476706d514e17b8141b7970e45e5 100644 (file)
@@ -1163,7 +1163,10 @@ ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
     port = cmcf->ports->elts;
     for (i = 0; i < cmcf->ports->nelts; i++) {
 
-        if (p != port[i].port || sa->sa_family != port[i].family) {
+        if (p != port[i].port
+            || lsopt->type != port[i].type
+            || sa->sa_family != port[i].family)
+        {
             continue;
         }
 
@@ -1180,6 +1183,7 @@ ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
     }
 
     port->family = sa->sa_family;
+    port->type = lsopt->type;
     port->port = p;
     port->addrs.elts = NULL;
 
@@ -1735,6 +1739,7 @@ ngx_http_add_listening(ngx_conf_t *cf, ngx_http_conf_addr_t *addr)
     }
 #endif
 
+    ls->type = addr->opt.type;
     ls->backlog = addr->opt.backlog;
     ls->rcvbuf = addr->opt.rcvbuf;
     ls->sndbuf = addr->opt.sndbuf;
index 4867bed2b37c61307e06cc68ecd67c16b059ac21..b0c8aabfcf45df1b5d9054d49c5570fe5dab7049 100644 (file)
@@ -3800,6 +3800,7 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t));
 
     lsopt.backlog = NGX_LISTEN_BACKLOG;
+    lsopt.type = SOCK_STREAM;
     lsopt.rcvbuf = -1;
     lsopt.sndbuf = -1;
 #if (NGX_HAVE_SETFIB)
@@ -3821,6 +3822,11 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
             continue;
         }
 
+        if (ngx_strcmp(value[n].data, "quic") == 0) {
+            lsopt.type = SOCK_DGRAM;
+            continue;
+        }
+
         if (ngx_strcmp(value[n].data, "bind") == 0) {
             lsopt.set = 1;
             lsopt.bind = 1;
index f5434cc511e681962ed365a45925a3b70370b6a7..9f26b5794ee2ef232eabc43c1f72fa8e6f82a710 100644 (file)
@@ -86,6 +86,7 @@ typedef struct {
     int                        backlog;
     int                        rcvbuf;
     int                        sndbuf;
+    int                        type;
 #if (NGX_HAVE_SETFIB)
     int                        setfib;
 #endif
@@ -266,6 +267,7 @@ typedef struct {
 
 typedef struct {
     ngx_int_t                  family;
+    ngx_int_t                  type;
     in_port_t                  port;
     ngx_array_t                addrs;     /* array of ngx_http_conf_addr_t */
 } ngx_http_conf_port_t;
index bb69e71d0f29ac3b6088a1b20174b261455869b5..f137590fd519b99b96aa1a5abe1fa2b1ee637b23 100644 (file)
@@ -324,6 +324,10 @@ ngx_http_init_connection(ngx_connection_t *c)
     rev->handler = ngx_http_wait_request_handler;
     c->write->handler = ngx_http_empty_handler;
 
+    if (c->shared) {
+        rev->ready = 1;
+    }
+
 #if (NGX_HTTP_V2)
     if (hc->addr_conf->http2) {
         rev->handler = ngx_http_v2_init;
@@ -386,6 +390,10 @@ ngx_http_wait_request_handler(ngx_event_t *rev)
 
     ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http wait request handler");
 
+    if (c->shared) {
+        goto request;
+    }
+
     if (rev->timedout) {
         ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT, "client timed out");
         ngx_http_close_connection(c);
@@ -486,6 +494,8 @@ ngx_http_wait_request_handler(ngx_event_t *rev)
         }
     }
 
+request:
+
     c->log->action = "reading client request line";
 
     ngx_reusable_connection(c, 0);