diff src/http/modules/ngx_http_ssl_module.c @ 8626:e0947c952d43 quic

QUIC: multiple versions support in ALPN. Previously, a version based on NGX_QUIC_DRAFT_VERSION was always set. Now it is taken from the negotiated QUIC version that may differ.
author Sergey Kandaurov <pluknet@nginx.com>
date Tue, 10 Nov 2020 00:32:56 +0300
parents 71b7453fb11f
children 5b51d8405378
line wrap: on
line diff
--- a/src/http/modules/ngx_http_ssl_module.c
+++ b/src/http/modules/ngx_http_ssl_module.c
@@ -418,6 +418,9 @@ ngx_http_ssl_alpn_select(ngx_ssl_conn_t 
     unsigned char *outlen, const unsigned char *in, unsigned int inlen,
     void *arg)
 {
+#if (NGX_HTTP_QUIC)
+    const char             *fmt;
+#endif
     unsigned int            srvlen;
     unsigned char          *srv;
 #if (NGX_DEBUG)
@@ -452,16 +455,32 @@ ngx_http_ssl_alpn_select(ngx_ssl_conn_t 
 
     } else
 #endif
-#if (NGX_HTTP_V3)
-    if (hc->addr_conf->http3) {
-        srv = (unsigned char *) NGX_HTTP_V3_ALPN_ADVERTISE;
-        srvlen = sizeof(NGX_HTTP_V3_ALPN_ADVERTISE) - 1;
-    } else
-#endif
 #if (NGX_HTTP_QUIC)
     if (hc->addr_conf->quic) {
-        srv = (unsigned char *) NGX_HTTP_QUIC_ALPN_ADVERTISE;
-        srvlen = sizeof(NGX_HTTP_QUIC_ALPN_ADVERTISE) - 1;
+#if (NGX_HTTP_V3)
+        if (hc->addr_conf->http3) {
+            srv = (unsigned char *) NGX_HTTP_V3_ALPN_ADVERTISE;
+            srvlen = sizeof(NGX_HTTP_V3_ALPN_ADVERTISE) - 1;
+            fmt = NGX_HTTP_V3_ALPN_DRAFT_FMT;
+
+        } else
+#endif
+        {
+            srv = (unsigned char *) NGX_HTTP_QUIC_ALPN_ADVERTISE;
+            srvlen = sizeof(NGX_HTTP_QUIC_ALPN_ADVERTISE) - 1;
+            fmt = NGX_HTTP_QUIC_ALPN_DRAFT_FMT;
+        }
+
+        /* QUIC draft */
+
+        if (ngx_quic_version(c) > 1) {
+            srv = ngx_pnalloc(c->pool, sizeof("\x05h3-xx") - 1);
+            if (srv == NULL) {
+                return SSL_TLSEXT_ERR_NOACK;
+            }
+            srvlen = ngx_sprintf(srv, fmt, ngx_quic_version(c)) - srv;
+        }
+
     } else
 #endif
     {