# HG changeset patch # User Roman Arutyunyan # Date 1584980784 -10800 # Node ID c9c3a73df6e8a59781b943f518910a5c5a1761e0 # Parent 159eb325ec82390e0449d58d824545798f58b7db Support for HTTP/3 ALPN. This is required by Chrome. diff --git a/src/event/ngx_event_quic.h b/src/event/ngx_event_quic.h --- a/src/event/ngx_event_quic.h +++ b/src/event/ngx_event_quic.h @@ -11,8 +11,8 @@ #include -#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 diff --git a/src/event/ngx_event_quic_transport.c b/src/event/ngx_event_quic_transport.c --- 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 diff --git a/src/http/modules/ngx_http_ssl_module.c b/src/http/modules/ngx_http_ssl_module.c --- 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; diff --git a/src/http/v3/ngx_http_v3.h b/src/http/v3/ngx_http_v3.h --- 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