changeset 8269:c9c3a73df6e8 quic

Support for HTTP/3 ALPN. This is required by Chrome.
author Roman Arutyunyan <arut@nginx.com>
date Mon, 23 Mar 2020 19:26:24 +0300
parents 159eb325ec82
children c87a13514abc
files src/event/ngx_event_quic.h src/event/ngx_event_quic_transport.c src/http/modules/ngx_http_ssl_module.c src/http/v3/ngx_http_v3.h
diffstat 4 files changed, 22 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/event/ngx_event_quic.h
+++ b/src/event/ngx_event_quic.h
@@ -11,8 +11,8 @@
 #include <ngx_event_openssl.h>
 
 
-#define quic_version        0xff000018  /* draft-24 (ngtcp2) */
-//#define quic_version      0xff00001b  /* draft-27 (FFN 76) */
+#define NGX_QUIC_DRAFT_VERSION               24
+#define NGX_QUIC_VERSION  (0xff000000 + NGX_QUIC_DRAFT_VERSION)
 
 #define NGX_QUIC_MAX_SHORT_HEADER            25
 #define NGX_QUIC_MAX_LONG_HEADER             346
--- a/src/event/ngx_event_quic_transport.c
+++ b/src/event/ngx_event_quic_transport.c
@@ -56,7 +56,7 @@ static u_char *ngx_quic_parse_int_multi(
 static void ngx_quic_build_int(u_char **pos, uint64_t value);
 
 static u_char *ngx_quic_read_uint8(u_char *pos, u_char *end, uint8_t *value);
-/*static*/ u_char *ngx_quic_read_uint16(u_char *pos, u_char *end, uint16_t *value); // usage depends on quic_version
+/*static*/ u_char *ngx_quic_read_uint16(u_char *pos, u_char *end, uint16_t *value); // usage depends on NGX_QUIC_VERSION
 static u_char *ngx_quic_read_uint32(u_char *pos, u_char *end, uint32_t *value);
 static u_char *ngx_quic_read_bytes(u_char *pos, u_char *end, size_t len,
     u_char **out);
@@ -295,7 +295,7 @@ ngx_quic_parse_long_header(ngx_quic_head
     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, pkt->log, 0,
                    "quic flags:%xi version:%xD", pkt->flags, pkt->version);
 
-    if (pkt->version != quic_version) {
+    if (pkt->version != NGX_QUIC_VERSION) {
         ngx_log_error(NGX_LOG_ERR, pkt->log, 0,
                       "unsupported quic version: 0x%xi", pkt->version);
         return NGX_ERROR;
@@ -349,7 +349,7 @@ ngx_quic_create_long_header(ngx_quic_hea
 
     *p++ = pkt->flags;
 
-    p = ngx_quic_write_uint32(p, quic_version);
+    p = ngx_quic_write_uint32(p, NGX_QUIC_VERSION);
 
     *p++ = pkt->scid.len;
     p = ngx_cpymem(p, pkt->scid.data, pkt->scid.len);
@@ -1327,7 +1327,7 @@ ngx_quic_parse_transport_params(u_char *
 {
     ngx_int_t  rc;
 
-#if (quic_version < 0xff00001b)
+#if (NGX_QUIC_DRAFT_VERSION < 27)
 
     uint16_t  id, len, tp_len;
 
@@ -1493,7 +1493,7 @@ ngx_quic_create_transport_params(u_char 
     u_char  *p;
     size_t   len;
 
-#if (quic_version < 0xff00001b)
+#if (NGX_QUIC_DRAFT_VERSION < 27)
 
 /* older drafts with static transport parameters encoding */
 
@@ -1548,13 +1548,13 @@ ngx_quic_create_transport_params(u_char 
                            tp->initial_max_stream_data_uni);
 
     if (pos == NULL) {
-#if (quic_version < 0xff00001b)
+#if (NGX_QUIC_DRAFT_VERSION < 27)
         len += 2;
 #endif
         return len;
     }
 
-#if (quic_version < 0xff00001b)
+#if (NGX_QUIC_DRAFT_VERSION < 27)
     /* TLS extension length */
     p = ngx_quic_write_uint16(p, len);
 #endif
--- a/src/http/modules/ngx_http_ssl_module.c
+++ b/src/http/modules/ngx_http_ssl_module.c
@@ -371,7 +371,7 @@ ngx_http_ssl_alpn_select(ngx_ssl_conn_t 
 #if (NGX_DEBUG)
     unsigned int            i;
 #endif
-#if (NGX_HTTP_V2)
+#if (NGX_HTTP_V2 || NGX_HTTP_V3)
     ngx_http_connection_t  *hc;
 #endif
 #if (NGX_HTTP_V2 || NGX_DEBUG)
@@ -388,9 +388,11 @@ ngx_http_ssl_alpn_select(ngx_ssl_conn_t 
     }
 #endif
 
-#if (NGX_HTTP_V2)
+#if (NGX_HTTP_V2 || NGX_HTTP_V3)
     hc = c->data;
+#endif
 
+#if (NGX_HTTP_V2)
     if (hc->addr_conf->http2) {
         srv =
            (unsigned char *) NGX_HTTP_V2_ALPN_ADVERTISE NGX_HTTP_NPN_ADVERTISE;
@@ -398,6 +400,12 @@ 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
     {
         srv = (unsigned char *) NGX_HTTP_NPN_ADVERTISE;
         srvlen = sizeof(NGX_HTTP_NPN_ADVERTISE) - 1;
--- a/src/http/v3/ngx_http_v3.h
+++ b/src/http/v3/ngx_http_v3.h
@@ -17,6 +17,9 @@
 
 #define NGX_HTTP_V3_STREAM             0x48335354   /* "H3ST" */
 
+#define NGX_HTTP_V3_ALPN(s)         NGX_HTTP_V3_ALPN_DRAFT(s)
+#define NGX_HTTP_V3_ALPN_DRAFT(s)   "\x05h3-" #s
+#define NGX_HTTP_V3_ALPN_ADVERTISE  NGX_HTTP_V3_ALPN(NGX_QUIC_DRAFT_VERSION)
 
 #define NGX_HTTP_V3_VARLEN_INT_LEN                 4
 #define NGX_HTTP_V3_PREFIX_INT_LEN                 11